#include <stdio.h>
#include <cstring>/*
本题要注意坐标可以用一个数来表示,p, x = p / n; y = p % n;
*/char map[4][4];
bool mark[4][4];
int n, ans;bool Judge(int nx, int ny)
{
if(mark[nx][ny] == 1)
return false;
//判断与(nx, ny)在同一行和同一列上的点
for(int k = nx; k >= 0; k--)
{
if(map[k][ny] == 'X')
break;
if(mark[k][ny] == 1) //同一行上已经有炮台
return false;
}
for(int k = ny; k >= 0; k--)
{
if(map[nx][k] == 'X')
break;
if(mark[nx][k] == 1) //同一列上已经有炮台
return false;
}
return true;
}void DFS(int p, int t)
{
if(p == n*n)
{
if(ans < t)
ans = t;
return;
}
int x = p / n, y = p % n;
if(map[x][y] == '.' && Judge(x, y))
{
mark[x][y] = 1;
DFS(p+1, t+1);
mark[x][y] = 0;
}
DFS(p+1, t); //在(x,y)处没有放炮台
}int main()
{
while(~scanf("%d", &n) && n != 0)
{
getchar();
for(int i = 0; i < n; i++)
scanf("%s", map[i]);
memset(mark, 0, sizeof(mark));
DFS(0,0);
printf("%d\n", ans);
ans = 0;
}
return 0;
}
Fire Net HDU - 1045-(DFS)
猜你喜欢
转载自blog.csdn.net/mch2869253130/article/details/82143772
今日推荐
周排行