求助!!!

tumd 2019-08-21 11:39:33 2019-08-21 11:41:09

#10701. 有障碍的八皇后问题 求助!!!


这是一份提问帖的模板


我的思路


  • 递归求解
  • 特判障碍

我的代码


#include <bits/stdc++.h>
using namespace std;

int z;    // z:z个障碍;
struct{int x,y;}NO[65];
int tot;
int vis[3][8];

bool F(int x,int y) {
	for (int i = 0;i < z; ++i) {
		if (NO[i].x == x && NO[i].y == y)	return 1;
	}
	return 0;
}

#ifdef DEBUG
void print(int n) {
	for (int i = 0;i < n; ++i) {
		for (int j = 0;j < n; ++j) {
			printf("%d ", vis[0][j] ? 1 : 0);
		}
		puts("");
	}
}
#endif
void queen(int nw,int n) {	//n:n*n的格子
	//printf("%d %d\n",nw,n);
    if (nw == n) 
	{
        ++tot;
        //print(n);
        //puts("");
        return;
    }
    for (int i = 0;i < n ; ++i) {
        if (!vis[0][i] && !vis[1][nw + i] &&
            !vis[2][nw - i + 7] && F(nw,i)){
            	
            vis[0][i] = vis[1][nw + i] = vis[2][nw - i + 7] = 1;
            
            queen(nw + 1,n);
            
            vis[0][i] = vis[1][nw + i] = vis[2][nw - i + 7] = 0;
		}
            
    }
}

int main() {
	int n;
    scanf("%d%d", &n, &z);	//n:n*n的格子
    for (int i = 0;i < z; ++i) {
    	scanf("%d%d", &NO[i].x, &NO[i].y);
	}
	
	queen(0,n);
	
	printf("%d", tot);
    return 0;
}

我的问题


  1. 我觉得问题出在 queen 函数的 if 语句。
  • 所以我打印了 n,nw 的值。
  • 但是, n != nw
  • 所以我觉得很奇怪。

特发此帖

共 5 条回复

tumd

谢谢

xx
int vis[3][8];

最好开大一点,比如vis[3][20],因为nw-i+7最大7-0+7=14。

xx

还有,以后发具体题目时最好发题目板块。 (点开题库,点开题目,在里面点讨论(最后一个,棕色))

xx

我正好也做这道题,看到了回复一个【滑稽】

xx

优化

struct{int x,y;}NO[65];
bool F(int x,int y) {
	for (int i = 0;i < z; ++i) {
		if (NO[i].x == x && NO[i].y == y)	return 1;
	}
	return 0;
}

可改为:

int h[10][10];
bool F(int x,int y){
    if(h[x][y]) return 1;
    return 0;
}

问题

struct{int x,y;}NO[65];

对比一下:

struct Chess {int x,y}NO[65];

你的F函数返回true是不符合,所以queen调用时应写**!F(nw,i)**。