poj 1321
思路是: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; }