1958 扫地机51nod

 A 扫地机
1.0 秒 131,072.0 KB 100 分
公司里用扫地机进行扫地,在扫地机进行扫地之前,我们先把一张公司的地图传送到扫地机里,地图用一个矩形网格表示,有垃圾的地方会被做一个标记。每一台扫地机从左上角开始,然后一直移动到右下角。扫地机只能向下或者向右移动。经过一个包含垃圾的格子时,扫地机就会把垃圾收集起来。扫地机移动到右下角之后就不会再移动了。现在给定一个地图,问最少要几台扫地机才能把地扫干净。

样例解释:

上图对应样例,下面两个图对应了两种方案,而第二种只需要两个扫地机。

输入
单组测试数据。
输入有若干行,每一行给出两个整数(x,y) ,(1<=x,y<=24),表示垃圾所在的行和列,最后输入两个0表示输入结束。行和列的编号按照样例中的规则所示。没有两个点是重合的。
输出
输出一个整数表示答案。
输入样例
1 2
1 4
2 4
2 6
4 4
4 7
6 6
0 0
输出样例
2

#include<bits/stdc++.h>
using namespace std;
bool lj[31][31]={false};
int za=1,ans=0;
int x,y,mx=-1,my=-1;
int dg(int i,int j){
    if(ans==0){
        return za;
    }
    if(i==mx&&j==my){
        za++;
        dg(1,1); 
    }
    else if(i==mx){
        for(int m=j;m<=my;){
            dg(i,j+1);
            if(lj[i][j]==true){
                lj[i][j]=false;
                ans--;
            }
        }
    }
    else if(i==my){
        for(int m=i;m<=mx;){
            dg(i+1,j); 
            if(lj[i][j]==true){
                lj[i][j]=false;
                ans--;
            }
        }
    }
    else if(lj[i+1][j]==true&&lj[i][j+1]==false){
        dg(i+1,j);
        lj[i][j]=false;
        ans--;
    }
    else if(lj[i][j+1]==true&&lj[i+1][j]==false){
        dg(i,j+1);
        lj[i][j]=false;
        ans--;
    }
    else if(lj[i+1][j]==true&&lj[i][j+1]==true){
        dg(i+1,j);
        lj[i][j]=false;
        ans--;
    }
    else if(lj[i+1][j]==false&&lj[i][j+1]==false){
        dg(i,j+1);
    }
}
int main(){
    for(;;){
        cin>>x>>y;
        if(x==0&&y==0){
            break;
        }
        ans++; 
        lj[x][y]=true;
        mx=max(mx,x);
        my=max(my,y);
    }
    cout<<0-dg(1,1)<<endl;
    return 0;
}