首页 > 其他分享 >八皇后(bfs)旧题新做

八皇后(bfs)旧题新做

时间:2023-09-17 22:59:49浏览次数:30  
标签:int long 旧题 bfs dfs 对角线 皇后 include

  • 题意

题目链接:https://www.luogu.com.cn/problem/P1219?contestId=130784

题意就是给一个 N x N 的矩阵,然后放 N 个皇后,问可以怎么放,有多少种放法。

  • 思路

dfs。
需要三个数组,col[i] 用来存第 i 列是否放置了皇后,dg[i] 用来存对角线 i 是否放置了皇后,udg[i] 用来存反对角线 i 是否放置了皇后。
然后思路的话就是一行一行搜,比如说搜到了第 u 行,那么我们从左到右遍历一下,上面三个数组都放了皇后没,如果没放,那就把它放上去。有一个难点就是怎么判断对角线和反对角线,对角线就是 u + i ,至于原因就是因为这是一个正方形,然后关于对角线对称,所以你如果把一个点的行数加上列数,那么这一定就是一条对角线。同理反对角线就是 u - i + n,为什么要加 n ,因为防止出现负数嘛,行数又不一定大于列数。

  • 代码

#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll; 
typedef pair<int, int> PII;
const int N = 100;
int n, m, k;
bool col[N], dg[N], udg[N];
vector<int> v;

void dfs(int u){
    if (u == n+1){
        k ++;
        if (k <= 3){
            for (auto t : v)cout << t << ' ';
            cout << endl;
        }
        return;
    }

    for (int i = 1; i <= n; i ++){
        if (!col[i] && !dg[u+i] && !udg[u-i+n]){
            col[i] = dg[u+i] = udg[u-i+n] = true;
            v.push_back(i);
            dfs(u+1);
            col[i] = dg[u+i] = udg[u-i+n] = false;
            v.pop_back();
        }
    }
    return;
}

void sovle(){
    cin >> n;
    dfs(1);
    cout << k << endl;
}

int main()
{
    int t = 1; 
    //scanf("%d", &t);

    while (t --){
         sovle();
    }

    return 0;
}



标签:int,long,旧题,bfs,dfs,对角线,皇后,include
From: https://www.cnblogs.com/Shunn/p/17710021.html

相关文章

  • POJ 2935 Basic Wall Maze BFS
    注意墙的处理,我是这么做的,把每个方块不能行走的方向标记出来,剩他的就是传统BFS了。#include<stdio.h>#include<queue>usingnamespacestd;intsx,sy,ex,ey;inth[4]={1,-1,0,0};intg[4]={0,0,1,-1};intdir[8][8][5];boolvisit[7][7];structpoint{ intx; inty; in......
  • RBFS简单理解
    论文引用Sharma,DishaandSanjayKumarDubey.“ComparativeStudyofRBFS&ARBFSAlgorithm.”IOSRJournalofComputerEngineering10(2013):105-110.前言论文中的伪代码可能有错误贴一份写的比较清楚点的帖子算法思路在h函数保证一致性的情况下,第一次扩展到n时......
  • 2013_q2bfsm
    moduletop_module(inputclk,inputresetn,//active-lowsynchronousresetinputx,inputy,outputf,outputg);parameterA=0,B=1,C=2,D=3,E=4,F=5,G=6,H=7,ON=14,OFF=15;reg[3:0]state,nst......
  • hdu 1372 Knight Moves 骑士的移动 bfs--马走日
    #include<stdio.h>#include<string.h>#include<queue>usingnamespacestd;charss[3],ee[3];intx1,y1,x2,y2;structpos{intx,y,step;}sta,end;intf[10][10];intdir[8][2]={1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};boolfan......
  • 1213:八皇后问题
    #include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#defineN100usingnamespacestd;inta[N][N],b[N];intvis[N][N];inttot;intdir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};voiddfs(intstep){if(step==8+1){......
  • 代码随想录算法训练营第三十天| 51. N皇后 37. 解数独 总结
        卡哥建议:今天这三道题都非常难,那么这么难的题,为啥一天做三道? 因为 一刷 也不求大家能把这么难的问题解决,所以 大家一刷的时候,就了解一下题目的要求,了解一下解题思路,不求能直接写出代码,先大概熟悉一下这些题,二刷的时候,随着对回溯算法的深入理解,再去解决如下三题。 ......
  • 邻接矩阵的BFS
    intArrNum(GraphG,intver){for(inti=0;i<G.VerNum;i++)if(G.Ver[i]==ver)returni;elsereturn-1;}intFirstNeighbor(GraphG,intver){intx=ArrNum(G,ver);for(inti=0;i<G.VerNum;i++){......
  • hdu:Rescue(bfs+优先队列)
    ProblemDescriptionAngelwascaughtbytheMOLIGPY!HewasputinprisonbyMoligpy.TheprisonisdescribedasaN*M(N,M<=200)matrix.ThereareWALLs,ROADs,andGUARDsintheprison.Angel’sfriendswanttosaveAngel.Theirtaskis:approach......
  • hdu:Knight Moves(bfs)
    ProblemDescriptionAfriendofyouisdoingresearchontheTravelingKnightProblem(TKP)whereyouaretofindtheshortestclosedtourofknightmovesthatvisitseachsquareofagivensetofnsquaresonachessboardexactlyonce.Hethinksthatthe......
  • hdu:A strange lift(bfs)
    ProblemDescriptionThereisastrangelift.Theliftcanstopcanateveryfloorasyouwant,andthereisanumberKi(0<=Ki<=N)oneveryfloor.Thelifthavejusttwobuttons:upanddown.Whenyouatfloori,ifyoupressthebutton“UP”,youwi......