题解 | #八皇后#

八皇后

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

第二次写 八皇后了 感觉还是有点力不从心 诶

感觉DFS跟回溯就是一个东西

其实还是一个搜索问题

处理点比较慢的地方 一是标记访问数组 和 回溯撤销访问标记 这里可用checkboard[i][j] = value value 可用来表示此处已经标记了皇后的数目 很方便!!用来回溯

还有就是递归终止条件 地方 出现失误 到第八层就够了!!

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

int checkboard[10][10];
int n;
vector<int> path;
vector<vector<int>> res;

void mark(int x, int y){
    for(int i = 1; i <= 8; i++){
        checkboard[x][i]++;
        checkboard[i][y]++;
    }
    for(int i = x - 1, j = y - 1; i >= 1&& j >= 1; i--,j--){
        checkboard[i][j]++;
    }
    for(int i = x + 1, j = y + 1; i <= 8&& j <= 8; i++,j++){
        checkboard[i][j]++;
    }
    for(int i = x - 1, j = y + 1; i >= 1&& j <= 8; i--,j++){
        checkboard[i][j]++;
    }
    for(int i = x + 1, j = y - 1; i <= 8&& j >= 1; i++,j--){
        checkboard[i][j]++;
    }

}

void undoMark(int x, int y){ //回溯撤销标记
    for(int i = 1; i <= 8; i++){
        checkboard[x][i]--;
        checkboard[i][y]--;
    }
    for(int i = x - 1, j = y - 1; i >= 1&& j >= 1; i--,j--){
        checkboard[i][j]--;
    }
    for(int i = x + 1, j = y + 1; i <= 8&& j <= 8; i++,j++){
        checkboard[i][j]--;
    }
    for(int i = x - 1, j = y + 1; i >= 1&& j <= 8; i--,j++){
        checkboard[i][j]--;
    }
    for(int i = x + 1, j = y - 1; i <= 8&& j >= 1; i++,j--){
        checkboard[i][j]--;
    }

}

bool DFS(int x, int y){ //其实跟回溯板子真的很像 更喜欢这种吧
    if(x == 8) { //边界判断条件
        res.push_back(path);
        return true;
    }
    if(checkboard[x][y] == 1) return false; //如果这个地方有点多余了
    for(int j = 1; j <= 8; j++){
        if(checkboard[x + 1][j] > 0) continue; //若已标记过 则跳过
        mark(x + 1,j); //标记
        path.push_back(j); //放入path中
        DFS(x + 1,j);//继续遍历
        path.pop_back(); //撤销 回退
        undoMark(x + 1,j); //撤销回退
    }

    return false;


}



int main() {
    memset(checkboard, 0, sizeof(checkboard));
    DFS(0,0);
    int b;
    while (cin >>  b) { // 注意 while 处理多个 case
        vector<int> ans = res[b - 1];
        for(auto i : ans) cout << i;
        cout << endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

11-08 17:36
诺瓦科技_HR
点赞 评论 收藏
分享
10-18 13:01
已编辑
西安理工大学 C++
小米内推大使:建议技能还是放上面吧,hr和技术面试官第一眼想看的应该是技能点和他们岗位是否匹配
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务