题意:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
分析:
1、和八皇后很相似,一行一行的放,并判断该列是否放过。
2、唯一注意的是,因为要摆放的棋子数k可能小于棋盘的行数,所以不一定是从第一行开始放的,所以每行的情况都要搜一下。
#include<cstdio> #include<cstring> using namespace std; char pic[10][10]; int n, k; bool judge(int x, int y){ return x >= 0 && x < n && y >= 0 && y < n; } int ans; bool vis[10]; void dfs(int cur, int cnt){ if(cnt == k){ ++ans; return; } if(cur == n) return; for(int i = 0; i < n; ++i){ if(pic[cur][i] == '#' && !vis[i]){ vis[i] = true; dfs(cur + 1, cnt + 1); vis[i] = false; } } dfs(cur + 1, cnt); } int main(){ while(scanf("%d%d", &n, &k) == 2){ if(n == -1 && k == -1) return 0; memset(vis, 0, sizeof vis); for(int i = 0; i < n; ++i){ scanf("%s", pic[i]); } ans = 0; dfs(0, 0); printf("%d ", ans); } return 0; }