您的位置:首页 > 其它

POJ 1321 棋盘问题 --- DFS

2015-12-04 23:48 465 查看
  POJ 1321

  题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子。 (注意 .不可放 #可放)

  解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标记,直至放完要求的棋子数。

/*POJ 1321 棋盘问题 --- DFS*/
#include <cstdio>
#include <cstring>

int n, k, cnt;
bool visit[10]; //标记列的访问状态
char mapp[10][10];

/*从第r行开始正确放置p个棋子*/
void dfs(int r, int p){
if (p == 0){
++cnt;
return;
}
if (r >= n || n-r < p) //剪枝 --> n-r >= p才能成功放置
return;
for (int j = 0; j < n; ++j){
if (mapp[r][j] == '#' && !visit[j]){
visit[j] = 1; //在r行j列放一枚棋子
dfs(r + 1, p - 1);
visit[j] = 0;
}
}
dfs(r + 1, p); //由于棋子数小于行数, 可以第r行不放棋子,从下一行开始
}

int main()
{
while (scanf("%d%d", &n, &k) == 2){
if (n == -1 && k == -1)
break;
cnt = 0;
memset(visit, 0, sizeof visit);
for (int i = 0; i < n; ++i){
scanf("%s", mapp[i]);
}
dfs(0, k);
printf("%d\n", cnt);
}

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: