您的位置:首页 > 其它

UVa 639 Don't Get Rooked

2014-05-18 20:03 316 查看
此题跟八个皇后有些相似......只不过加了“墙”......要注意DFS参数设定

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=5;
int n,ans=0;
int map[MAXN][MAXN];
int vis[MAXN][MAXN];
bool ok(int x, int y)
{
if(map[x][y] || vis[x][y])
return false;
for(int i=x-1; i>=0 && !map[i][y]; i--) //判断列是否合法
if(vis[i][y])
return false;
for(int i= y-1; i>=0 && !map[x][i]; i--) //判断行是否合法
if( vis[x][i])
return false;
return true;
}
void dfs(int x,int y, int num)
{
if(x == n)
{
if(num >ans)
ans=num;
return;
}
if(ok(x, y))
{
vis[x][y] =1;
if(y >= n-1)
dfs(x+1, 0, num+1);
else
dfs(x, y+1, num+1);
vis[x][y]=0;
}//在这一定不能有else,不然无法遍历矩阵全部数据
if(y >= n-1)
dfs(x+1, 0, num);
else
dfs(x, y+1, num);
}
int main()
{
char s[MAXN];
while(scanf("%d", &n) != EOF && n)
{
memset(map, 0, sizeof(map));
memset(vis, 0, sizeof(vis));
for(int i=0; i<n; i++)
{
scanf("%s", s);
for(int j=0; j<n; j++)
if(s[j] == 'X')
map[i][j]=1;
}
ans=0;
dfs(0,0,0);
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: