323:棋盘问题

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;
}

错误日志链接

猜你喜欢

转载自blog.csdn.net/weixin_46028214/article/details/113114913
今日推荐