zoukankan      html  css  js  c++  java
  • [蓝桥杯] BASIC-27 基础训练 【2n皇后问题】 Apare_xzc 100

    [蓝桥杯] BASIC-27 基础训练 【2n皇后问题】 Apare_xzc 100


    在这里插入图片描述

    题面:

    在这里插入图片描述

    分析:

          同八皇后问题


    我的AC代码

    #include <bits/stdc++.h>
    #define BLACK 2
    #define WHITE 3
    using namespace std;
    int a[10][10],n,ans;
    int vb[10],vw[10]; //记录每一行黑白的列数 
    bool visBlack[10],visWhite[10]; //记录第i行的皇后所在的列数 
    void dfs(int);
    int main()
    {
    	cin>>n;
    	for(int i=0;i<n;++i)
    		for(int j=0;j<n;++j)
    			scanf("%d",&a[i][j]);
    	ans = 0;
    	dfs(0);
    	cout<<ans<<endl;
    
    	return 0;	
    } 
    
    void dfs(int x)
    {
    	if(x==n) //搜到结果了,答案加一
    	{
    		ans++;return;
    	}
    	for(int black=0;black<n;black++) //枚举第x行黑皇后的列位置
    	{
    		for(int white=0;white<n;++white) //枚举第x行白皇后的列位置
    		{
    			if(black==white||a[x][black]==0||a[x][white]==0) continue; 
    			//标0的地方不能放,黑白皇后不能放一起
    			if(visBlack[black]||visWhite[white]) continue;
    			//不能和之前放的同色皇后在同一列
    			bool ok = true;
    			for(int i=0;i<x&&ok;++i) //每一行的黑白 
    			{ //判断对角线
    				if(abs(vb[i]-black)==abs(i-x)||abs(vw[i]-white)==abs(i-x))
    					ok = false; 
    			}
    			if(!ok) continue;
    			visBlack[black] = true, visWhite[white] = true; //标记
    			a[x][white] = WHITE, a[x][black] = BLACK; //放置
    			vb[x] = black, vw[x] = white; //记录位置
    			dfs(x+1); //搜索
    			visBlack[black] = false, visWhite[white] = false; //清除标记
    			a[x][white] = 1, a[x][black] = 1; //还原棋盘
    		}
    	}
    }
    

    在这里插入图片描述
    在这里插入图片描述


    2020.1.8 19:42

    by xzc

  • 相关阅读:
    bzoj 4197 寿司晚宴
    Codeforces Round #429 (Div. 2)ABC
    Codeforces Round #386 (Div. 2) E
    UESTC 电子科大专题训练 数论 L
    UESTC 电子科大专题训练 数论 E
    Codeforces Round #396 D
    UESTC 电子科大专题训练 DP-E
    UESTC 电子科大专题训练 数据结构 L
    UESTC 电子科大专题训练 数据结构 K
    UESTC 电子科大专题训练 数据结构-E
  • 原文地址:https://www.cnblogs.com/Apare-xzc/p/12243611.html
Copyright © 2011-2022 走看看