#include<stdio.h>
int n, k;
char s[8][8];
int ans = 0;
int check(int x, int y)
{
if (s[x][y] == '#')
{
for (int i = 0; i < n; i++)
{
if (s[i][y] == '*')
return 0;
}
for (int i = 0; i < n; i++)
{
if (s[x][i] == '*')
return 0;
}
return 1;
}
return 0;
}
void dfs(int x, int y,int t)
{
if (t == k)
{
ans++;
return;
}
if (x == n)
{
return;
}
if (y == n)
dfs(x + 1, 0, t);
for (int i = 0; i < n; i++)
{
if (check(x, i))
{
s[x][i] = '*';
dfs(x+1 ,0, t + 1);//主要这里应该直接去下一行找,想清楚就好
s[x][i] = '#';
}
}
dfs(x + 1, 0, t);//这一行可能性都return回来了进入下一行
}
void main()
{
while (scanf("%d %d", &n, &k)!=EOF)
{
ans = 0;
if (n == -1 && k == -1)
break;
for (int i = 0; i < n; i++)
{
scanf("%s", s[i]);
}
dfs(0, 0, 0);
printf("%d\n", ans);
}
}
1321 棋盘问题
原创PeterBishop ©著作权
©著作权归作者所有:来自51CTO博客作者PeterBishop的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
POJ 1321 - 棋盘问题..
简单的状态DP.由于审题不细..导致各种WA.... dp顺序至上而下...dp[x][y][z]代
#include i++ #define