zoukankan      html  css  js  c++  java
  • 【解题报告】洛谷P1219 八皇后

    【解题报告】洛谷P1219 八皇后

    题目链接

    https://www.luogu.com.cn/problem/P1219

    思路

    这个的话,直接搜索吧

    唯一需要注意的就是如何表示行或者列,或者对角线已经被选择了

    其中对角线就直接加起来就好了

    另一条对角线就直接用一个新的数组,然后也转化成相加相等的形式就可以了

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    using namespace std;
    const int maxn=30;
    int n;
    int cnt;
    bool hang[maxn],lie[maxn],dj[maxn],dj2[maxn];
    int rec[maxn];
    void dfs(int x)
    {
    	if(x==n)
    	{
    		cnt++;
    		if(cnt<=3)
    		{
    			for(int i=1;i<=n;i++)
    			cout<<rec[i]<<" ";
    			cout<<'
    ';
    			return ;
    		}
    		return ;
    	}
    	for(int i=1;i<=n;i++)
    	{
    		if(lie[i]||dj[x+1+i]||dj2[x+1+(n-i)]) continue;
    		lie[i]=true;
    		dj[x+1+i]=true;
    		dj2[x+1+(n-i)]=true;
    		rec[x+1]=i;
    		dfs(x+1);
    		rec[x+1]=0;
    		dj2[x+1+(n-i)]=false;
    		dj[x+1+i]=false;
    		lie[i]=false;
    	}
    }
    int main()
    {
    	cin>>n;
    	dfs(0);
    	cout<<cnt<<'
    ';
    	return 0;
    }
    
    本博文为wweiyi原创,若想转载请联系作者,qq:2844938982
  • 相关阅读:
    作业01
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    C语言I博客作业04
    C语言II博客作业04
    C语言II—作业03
    C语言II博客作业02
    C语言II博客作业01
  • 原文地址:https://www.cnblogs.com/wweiyi2004/p/15412543.html
Copyright © 2011-2022 走看看