C++ N 皇后问题,变量定义的顺序影响结果

方式一

#include <iostream>
using namespace std;
const int N = 10;

char grid[N][N];
// 下面2行变量的定义顺序
int n;
int row[N], col[N], dg[N], udg[N];



void dfs(int u){
    if(u == n){
        for(int i=0; i<n; i++)puts(grid[i]);
        puts("");
    }
    for(int i=0;i<n; i++){
        if(!row[i] && !col[i] && !dg[i+u] && !udg[i-u+n]){
            row[i]= col[i] = dg[i+u] = udg[i-u+n] = 1;
            grid[u][i] = 'Q';
            dfs(u+1);
            row[i] = col[i] = dg[i+u] = udg[i-u+n]=0;
            grid[u][i] ='.';
        }
    }
}
int main(){
    cin>>n;
    for(int i=0; i<n; i++)
    for(int j=0; j<n; j++) grid[i][j] ='.';
    dfs(0);
}

输入: 6
结果

.Q....
...Q..
.....Q
Q.....
..Q...
....Q.

..Q...
.....Q
.Q....
....Q.
Q.....
...Q..

...Q..
Q.....
....Q.
.Q....
.....Q
..Q...

....Q.
..Q...
Q.....
.....Q
...Q..
.Q....

方式二

#include <iostream>
using namespace std;
const int N = 10;

char grid[N][N];
// 定义变化
int row[N], col[N], dg[N], udg[N];
int n;



void dfs(int u){
    if(u == n){
        for(int i=0; i<n; i++)puts(grid[i]);
        puts("");
    }
    for(int i=0;i<n; i++){
        if(!row[i] && !col[i] && !dg[i+u] && !udg[i-u+n]){
            row[i]= col[i] = dg[i+u] = udg[i-u+n] = 1;
            grid[u][i] = 'Q';
            dfs(u+1);
            row[i] = col[i] = dg[i+u] = udg[i-u+n]=0;
            grid[u][i] ='.';
        }
    }
}
int main(){
    cin>>n;
    for(int i=0; i<n; i++)
    for(int j=0; j<n; j++) grid[i][j] ='.';
    dfs(0);
}

输入 6
结果

.Q....
...Q..
.....Q
Q.....
..Q...
....Q.

...Q..
Q.....
....Q.
.Q....
.....Q
..Q...

从表象来看是变量的定义顺序,具体是什么问题不清楚,没有查询到c++相关的问题,麻烦解答一下,谢谢。

阅读 1.9k
1 个回答
int row[N], col[N], dg[N], udg[N];

dg和udg是标记对角线数组,而一个方向的对角线有n*2-1条,而非n条。

row[i] = col[i] = dg[i+u] = udg[i-u+n] = 1;

dg[i+u]=1数组越界,因为i+u最大为10。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题