AcWing 1432.棋盘挑战

题解:棋盘挑战

题目描述

在这里插入图片描述

题目链接:
https://www.acwing.com/problem/content/1434/

思路分析

  • 首先会有的思路是DFS
    在这里插入图片描述
    在这里插入图片描述
  • 每次搜索到底后回溯过程一定要恢复现场,当我们回溯的时候,原来这个图是什么样的,我们还要变回什么样
  • 恢复现场目的: 当我们遍历完这条分支,去遍历下一条分支的时候,我们需要保证当前图其他条件的一致性,也就是遍历每一条分支的时候,当前图的状态都是一样的。保证每次遍历分支的公平性

代码实现

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 15;

int n;
bool col[N], dg[N * 2], udg[N * 2];
//col[N]--->判断某些位置到底能不能填  dg[N*2]--->判断对角线  dg[N*2]--->判断反对角线

int path[N], ans;//记录方案和答案的数量

void dfs(int x)//x表示行数
{
    
    
    if (x > n)
    {
    
    
        ans ++ ;
        if (ans <= 3)
        {
    
    
            for (int i = 1; i <= n; i ++ )//输出前三个方案
                cout << path[i] << ' ';
            cout << endl;
        }
        return;
    }

    for (int y = 1; y <= n; y ++ )//列是1到n枚举
        if (!col[y] && !dg[x + y] && !udg[x - y + n])
        {
    
    
            path[x] = y;
            col[y] = dg[x + y] = udg[x - y + n] = true;//标记一下 已经填了数了
            dfs(x + 1);//搜索下一层
            col[y] = dg[x + y] = udg[x - y + n] = false;//恢复现场
            path[x] = 0;
        }
}

int main()
{
    
    
    cin >> n;//读入行数
    dfs(1);//从第一行DFS
    cout << ans << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45657288/article/details/113063655