标签: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