zoukankan      html  css  js  c++  java
  • hdu2553 N皇后问题(dfs+回溯)

    N皇后问题

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 33731    Accepted Submission(s): 14463


    Problem Description
    在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
    你的任务是,对于给定的N,求出有多少种合法的放置方法。

     
    Input
    共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
     
    Output
    共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
     
    Sample Input
    1
    8
    5
    0
     
    Sample Output
    1
    92
    10
     

    ps 不打表会超时

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    int a[11][11];
    int result[11];
    int n,cnt;
    
    int panduan(int x,int y)
    {
      int i,j;
      for(i=0;i<y;i++)
        if(a[x][i])//如果同一行有被标记过的点
          return 0;
      for( i=x-1,j=y-1;i>=0&&j>=0;i--,j--)//如果主对角线有被标记过的点
        if(a[i][j])
          return 0;
      for(i=x+1,j=y-1;i<n&&j>=0;i++,j--)//副对角线
        if(a[i][j])
          return 0;
      return 1;
    }
    
    void dfs(int m)
    {
      if(m==n)//n是全局变量
        cnt++;
      for(int i=0;i<n;i++)
      {
        if(a[i][m]==0&&panduan(i,m))
          {
            a[i][m]=1;
            dfs(m+1);
            a[i][m]=0;//回溯
          }
      }
    }
    
    int main()
    {
      for(int i=0;i<11;i++)
      {
        cnt=0;
        n=i+1;
        memset(a,0,sizeof(a));
        dfs(0);
        result[i]=cnt;
      }
      while(cin>>n&&n)
      {
        cout<<result[n-1]<<endl;
      }
      return 0;
    }
  • 相关阅读:
    TreeMap<K,V>类
    2020-3-7学习地图
    Thread类
    Redis-Windows中注册Redis后台守护进程
    Redsi-(error) NOAUTH Authentication required.
    2020-3-6学习地图
    Collection<E>接口
    Map<K,V>接口
    Set接口
    List类
  • 原文地址:https://www.cnblogs.com/-citywall123/p/9506925.html
Copyright © 2011-2022 走看看