您的位置:首页 > 其它

poj 1321

2016-09-14 15:45 253 查看
思路是:dfs有两个参数 checkerNum 和 raw。checkerNum是棋子数量,raw是行号 。

先从第一行开始遍历,对第一行属于棋盘的每一列:开始下一行。

这一行处理完了,从下一行重新开始dfs。

#include <stdio.h>

int n, k, i, j, ans;
char maze[10][10];
int column[10];

void dfs(int checkerNum, int raw) { //checkerNum是棋子数量,raw是行号

if(checkerNum == k) {
ans++;
return;
}

if(raw >=n) return;

for(int t=0; t<n; t++) {
if(maze[raw][t] == '#' && column[t] == 0) {
checkerNum++;
column[t] = 1;
dfs(checkerNum, raw + 1); //继续下一行
column[t] = 0;
checkerNum--;
}
}
dfs(checkerNum, raw + 1); //第raw行结束。从下一行重新开始
}

int main() {

while(~scanf("%d%d", &n, &k)) {
if(n==-1 && k==-1) break;

getchar();
for(i=0; i<n; i++) {
for(j=0; j<n; j++)
scanf("%c", &maze[i][j]);
getchar();
}

ans = 0;
dfs(0, 0); //从第一行开始
printf("%d\n", ans);
}

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