题意: 给定一个n*n(n<=8)的棋盘, 有些地方能放棋子, 有些不能。 放m个棋子, 求能使这m个棋子不同行且不同列的方案数。
分析: 用一个一维数组标记行和列, 深搜一下。
#include<cstdio> #include<cstring> char s[10][10]; int n, m; int vis[10]; int ans; void dfs(int cur, int step) { if(step==m) { ans++; return; } if(cur>n-1) return; for(int i=cur; i<n; i++) for(int j=0; j<n; j++) if(s[i][j]==‘#‘&&!vis[j]) { vis[j]=1; dfs(i+1, step+1); vis[j]=0; } } int main() { while(scanf("%d%d", &n, &m)) { if(n==-1&&m==-1) break; for(int i=0; i<n; i++) scanf("%s", s[i]); memset(vis, 0, sizeof(vis)); ans = 0; dfs(0, 0); printf("%d\n", ans); } return 0; }
时间: 2024-11-25 19:18:56