此題跟八個皇后有些相似......只不過加了“牆”......要注意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;
}