题解 | #八皇后#

八皇后

https://www.nowcoder.com/practice/fbf428ecb0574236a2a0295e1fa854cb

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stack>
#include <map>
#include <queue>
#include <cmath>
using namespace std;

int res[93]; //存放结果的数组
int chessboard[8][8]; //棋盘 1表示有皇后
int pos[8]; //第i行的皇后放在pos[i]列
int index = 1;

/**
    row 行
    col 列
    判断chessboard[row][col]能不能放皇后
    能则返回true
*/
bool isvalid(int row, int col) {
  
    for (int i = 0; i < 8; i++) { //依次遍历每一行
        //如果当前列有皇后  或者   斜着的方向有皇后   则不行
        if (pos[i] == col || abs(pos[i] - col) == abs(i - row)) {
            return false;
        }
    }
    return true;
}

/**
    row 现在到了第几行
    seq 当前的输出是什么
*/
void queen(int row, int seq) {
    if (row == 8) { //已经超出棋盘了,保存结果
        res[index++] = seq;
        return;
    }
    //在第row行的每列进行查看,看能不能放皇后
    for (int i = 0; i < 8; i++) {
        if (isvalid(row, i)) {
            chessboard[row][i] = 1;
            pos[row] = i;
            //接着看下一行,加入对应的序列号
		    //这个i+1很关键别忘了从1开始的
            queen(row + 1, seq * 10 + i + 1);
            //回溯
            chessboard[row][i] = 0;
            pos[row] = 100;
        }
    }
    return;
}


int main() {
    int b;
    while (scanf("%d", &b) != EOF) { //要求第几个字符串
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                chessboard[i][j] = 0;  //初始化棋盘
            }
        }
	  
	  //随便找个值初始化pos数组,但注意这里最好不要为0,1,-1之类的,最好大一点
	  //防止在isvalid函数中abs计算有误会
        for (int i = 0; i < 8; i++) { 
            pos[i] = 100;
        }

        queen(0, 0); //从第0行开始, 初始序列为0

        printf("%d\n", res[b]);
    }

}

无语了,测试用例说我超时,但是确可以直接提交。。。。。。

全部评论

相关推荐

感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务