323:棋盘问题
题目链接http://noi.openjudge.cn/ch0205/323/
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
char a[10][10];
//bool vis[10][10];
int b[10];//b[i]为i行所选的列位置
int n, k;
int ans = 0;
bool cmp(int x,int y) {
for (int i = 1; i < x; i++) {
if (b[i] == y)// || abs(x - i) == abs(y - b[i])对角线
return false;
}
return true;
}
void solve(int r,int x) {
for (int i = 1; i <= n; i++) {
//选列
if (a[r][i] == '#' && cmp(r, i)) {
//判断
b[r] = i;
if (x + 1 == k) {
ans++;
}
else {
for (int j = r + 1; j <= n ; j++) {
//这里是j=r+1,不是i+1;找这个错误找了好久
solve(j, x + 1);
}
}
b[r] = 0;
}
}
}
int main() {
while (cin >> n >> k) {
if (n == -1 && k == -1)
break;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
ans = 0;
//memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++) {
memset(b, 0,sizeof(b));
solve(i, 0);
}
cout << ans << endl;
}
return 0;
}
错误日志链接