zoukankan      html  css  js  c++  java
  • 深搜--n皇后问题 hdu2553

    遇到的问题:one之前写了八皇后,对于n皇后的对角线问题一直有问题。但是仔细都列出来找了一下规律之后觉得其实蛮简单的。关键是对角线标记数组要开大一点,避免越界。  two都对了之后结果TLE,最后在帮助下打了个表,顺利通过啦。。

    思路:行不需要标记,从0循环到n-1,一种方法的递归结束条件是行循环到了n-1,只要列标记和对角线标记。

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    #include<queue>
    using namespace std;
    int n;
    int sum;
    int r[15],d1[35],d2[35],a[11];//d1和d2数组分别是两个对角线数组,注意要开得大一些,题目只有到10,所以35差不多啦
    void dfs(int k){
        if(k==n){
            sum++;
            return ;
        }
        for(int i=0;i<n;i++){
            if(!r[i]&&!d1[i+k]&&!d2[i-k+n-1]){
                r[i]=1;
                d1[i+k]=1;
                d2[i-k+n-1]=1;
                dfs(k+1);
                r[i]=0;
                d1[i+k]=0;
                d2[i-k+n-1]=0;//对角线这个规律不是唯一的
            }
        }
    }
    int main(){
        for(n=1;n<=10;n++){
            memset(r,0,sizeof(r));
            memset(d1,0,sizeof(d1));
            memset(d2,0,sizeof(d2));
            sum=0;
            dfs(0);
            a[n]=sum;
        }//这步避免的TLE
        while(scanf("%d",&n)!=EOF){
            if(n==0)
                break;
            cout<<a[n]<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    leetcode8.字符串转换整数(atoi)
    leetcode7、整数反转
    leetcode6.Z字形变换
    leetcode5.最长回文子串
    leetcode4.寻找两个正序数组的中位数
    leetcode3. 无重复字符的最长子串
    leetcode 2.两数相加
    leetcode 1. 两数之和
    post&get请求总结
    oracle知识总结
  • 原文地址:https://www.cnblogs.com/wsyxy/p/4278168.html
Copyright © 2011-2022 走看看