本文共 934 字,大约阅读时间需要 3 分钟。
类似于八皇后问题,但棋子数不等于行数,也不需要考虑对角线的情况。以下是解决方案:
#include#include #include #include using namespace std;const int maxn = 10;string ss[maxn];bool vis[maxn];int n, m;int tot = 0;void dfs(int cur, int num) { if (num == n) { if (cur == m) tot++; return; } for (int i = 0; i < n; i++) { if (!vis[i] && ss[num][i] == '#') { vis[i] = 0; dfs(cur + 1, num + 1); } } dfs(cur, num + 1);}int main() { while (~scanf("%d%d", &n, &m)) { if (n == -1 && m == -1) break; memset(vis, 0, sizeof(vis)); for (int i = 0; i < n; i++) { cin >> ss[i]; } tot = 0; dfs(0, 0); printf("%d\n", tot); } return 0;}
代码逻辑解析:
优化思路:
转载地址:http://nuxfk.baihongyu.com/