标签:dfs
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1045
4 .X.. .... XX.. .... 2 XX .X 3 .X. X.X .X. 3 ... .XX .XX 4 .... .... .... .... 0
5 1 5 2 4
题解:十天前写了下这题,一直WA~~ 刚刚重写,一次A了。总结起来,还是自己一些细节没有处理好。我是直接深搜,把每个点都遍历一遍。图很小,不会超时。据说还有用二分图匹配的——还没有接触,不会,以后再看看。
AC代码:
#include<iostream> #include<string> #define maxn 5 using namespace std; string chess[maxn],init[maxn]; int n,res; int dir[4][2]={ {0,1},{0,-1},{1,0},{-1,0} }; void Copy(string x[],string y[]){ for(int i=0;i<n;i++) x[i]=y[i]; } void SetFlag(int x,int y){ chess[x][y]='#'; for(int i=0;i<4;i++){ int dx=x+dir[i][0],dy=y+dir[i][1]; while(dx>=0&&dx<n&&dy>=0&&dy<n&&init[dx][dy]=='.'){ chess[dx][dy]='X'; dx+=dir[i][0]; dy+=dir[i][1]; } } } void dfs(int s,int cnt){ if(s>=n)return ; if(res<cnt)res=cnt; bool flag=true; for(int i=0;i<n;i++){ if(s>=0&&s<n&&chess[s][i]=='.'){ flag=false; string temp[maxn]; Copy(temp,chess); SetFlag(s,i); if(i==n-1)dfs(s+1,cnt+1); else dfs(s,cnt+1); Copy(chess,temp); } } if(s<n-1&&flag)dfs(s+1,cnt); } int main() { while(cin>>n&&n){ res=0; for(int i=0;i<n;i++) cin>>init[i]; for(int i=0;i<n;i++) for(int j=0;j<n;j++){ if(init[i][j]=='.'){ Copy(chess,init); SetFlag(i,j); dfs(0,1); } } cout<<res<<endl; } return 0; }
标签:dfs
原文地址:http://blog.csdn.net/mummyding/article/details/43345675