解题思路:与经典八皇后问题类似,但有一点不一样,因为此题的棋盘形状不定,故需要遍历整个区域,进行判断是否属于能放棋子的位置
# include <stdio.h>
# include <string.h>
# define M 10
char map[M][M];
int visrow[M]; //该行是否有棋子
int viscol[M]; //该列是否有棋子
int count;
int n, k;
bool isOk(int x, int y) // 判断一行或一列上是否有棋子
{
if (visrow[x] || viscol[y])
{
return false;
}
else
{
return true;
}
}
void dfs(int cur, int step)
{
if (step >= k)
{
count ++;
return ;
}
for (int i = cur; i < n; i++) //遍历整个区域,知道找到棋盘
{
for (int j = 0; j < n; j++)
{
if (map[i][j] == '#' && isOk(i, j)) //当是棋盘并且该行和该列都没有放棋子
{
visrow[i] = 1;
viscol[j] = 1;
dfs(i+1, step+1); //传参数是i+1, 不是cur+1 使用cur+1 虽然给出的数据能判断正确,但有些数据可能会导致错误,甚至死循环
visrow[i] = 0;
viscol[j] = 0;
}
}
}
}
int main(void)
{
while (scanf("%d %d", &n, &k), (n != -1 || k != -1))
{
int i;
count = 0;
memset(visrow, 0, sizeof(visrow));
memset(viscol, 0, sizeof(viscol));
memset(map, '.', sizeof(map));
for (i = 0; i < n; i++)
{
scanf("%s", map[i]);
}
dfs(0, 0);
printf("%d\n", count);
}
return 0;
}