码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 搜索练习 N皇后问题

时间:2016-04-17 20:42:22      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

N皇后问题

Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 39 Accepted Submission(s) : 18
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。<br>你的任务是,对于给定的N,求出有多少种合法的放置方法。<br><br>
 

 

Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
 

 

Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 

 

Sample Input
1
8
5
0
 

 

Sample Output
1
92
10
 
简单题意:
  给出棋盘大小,求有多少种办法,让皇后不能相互攻击,
 
思路分析:
  求路径, 用dfs深搜, ,, 但是会超时,又因为题目给出来,N <= 10, 哈哈
AC代码
# include <iostream>
using namespace std; // 超时,但是只有十个数字
int main()
{
    int n;
    int a[11] = {0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724};
    while(cin >> n)
    {
        if(n == 0)
        break;
        cout << a[n] << endl;
    }
    return 0;
}

超时代码:

  

#include<iostream>
#include<fstream>
using namespace std;
int a[16];
int n, sum;
bool f(int x)
{
    for(int i = 1; i < x; i++)
    {
        if(abs(x - i) == abs(a[x] - a[i]) || a[x] == a[i])
        return false;
    }
    return true;
}
int dfs(int x)
{
    if(x > n && n > 0)
        sum += 1;
    else
    {
        for(int i = 1; i <= n; i++)
        {
            a[x] = i;
            if(f(x))
            dfs(x + 1);
        }
    }
    return sum;
}
int main()
{
    //fstream cin("aaa.txt");
    while(cin >> n)
    {
        if(n == 0)
        break;
        sum = 0;
        cout << dfs(1) << endl;
    }
    return 0;
}

 

HDU 搜索练习 N皇后问题

标签:

原文地址:http://www.cnblogs.com/lyf-acm/p/5401980.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!