UVA639 Don't Get Rooked
类似八皇后问题,不过中间多了障碍物。。
深搜回溯,标记放过的点,。然后利用标记的点进行判断能不能放入。
#include <stdio.h>
#include <string.h>
int n;
char map[10][10];
int vis[10][10];
int max;
void dfs(int num)
{
if (max < num)
max = num;
for (int i = 1; i <= n ; i++)
for (int j = 1; j <= n; j ++)
{
int a, b;
a = i; b = j;
int judge = 0;
while (map[a][b] != 'X')
{
if (vis[a][b] == 1)
{
judge = 1;
break;
}
b ++;
}
a = i; b = j;
while (map[a][b] != 'X')
{
if (vis[a][b] == 1)
{
judge = 1;
break;
}
b --;
}
a = i; b = j;
while (map[a][b] != 'X')
{
if (vis[a][b] == 1)
{
judge = 1;
break;
}
a ++;
}
a = i; b = j;
while (map[a][b] != 'X')
{
if (vis[a][b] == 1)
{
judge = 1;
break;
}
a --;
}
if (map[i][j] == '.' && judge == 0)
{
vis[i][j] = 1;
dfs(num + 1);
vis[i][j] = 0;
}
}
}
int main()
{
while (scanf("%d", &n) != EOF && n)
{
getchar();
max = 0;
memset(map, 'X', sizeof(map));
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n ; i ++)
{
for (int j = 1; j <= n; j++)
{
scanf("%c", &map[i][j]);
}
getchar();
}
dfs(0);
printf("%d\n", max);
}
return 0;
}