ZOJ 1002 Fire Net dfs回溯
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002
n<=4,数不大枚举,从(1,1)枚举到(n,n),但是第三组数据通不过,我的思路是有错误的,
用回溯的方法,嗯,挺神奇的方法,虽然以前也用过回溯,还是有点震惊,以上是闲话
代码:
#include<iostream> #include<cstdio> #include<string> #include<cstring> #define MAX(a,b)a>b?a:b using namespace std; int map[5][5]; bool vx[5],vy[5]; int n,mAX; bool judge(int x,int y) { for(int i=x-1;i>=0;i--) { if(map[i][y]==2)return 0; if(map[i][y]==1)break; } for(int i=y-1;i>=0;i--) { if(map[x][i]==2)return 0; if(map[x][i]==1)break; } return 1; } void dfs(int u,int cnt) { if(u==n*n) { mAX=MAX(mAX,cnt); return; } int r=u/n; int c=u%n; if(!map[r][c]) { if(judge(r,c)) { map[r][c]=2; dfs(u+1,cnt+1); map[r][c]=0; } } dfs(u+1,cnt); return ; } int main() { int i,j; char ch; while(cin>>n&&n) { memset(map,0,sizeof(map)); for(i=0;i<n;i++) for(j=0;j<n;j++) { cin>>ch; if(ch=='X') map[i][j]=1; } mAX=0; dfs(0,0); cout<<mAX<<endl; } return 0; }