HDU-N皇后问题-DFS深度搜索

来源:互联网 发布:一整年的算法 编辑:程序博客网 时间:2024/04/30 00:49
问题及代码:

Problem D N皇后问题

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 3   Accepted Submission(s) : 2

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

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

Input

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

Output

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

Sample Input

1850

Sample Output

19210

/*    *Copyright (c)2015,烟台大学计算机与控制工程学院    *All rights reserved.    *文件名称:HDU.cpp    *作    者:单昕昕    *完成日期:2015年3月3日    *版 本 号:v1.0        */ #include<iostream>#include<cstdio>#include<cstring>using namespace std;int n,ans;int map[11];int visit[11];int sol[11];void dfs(int k){    int i,j,flag;    if(k==n+1)    {        ans++;        return;    }    for(i=1; i<=n; i++)        if(!visit[i])  //各行棋子不能在同一列        {            map[k]=i;            flag=1;            for(j=1; j<=k-1; j++) //判断是否在同一斜线上                if((map[k]-map[j])==(k-j)||(map[k]-map[j])==(j-k))                {                    flag=0;                    break;                }            if(flag)            {                visit[i]=1;                dfs(k+1);                visit[i]=0;  //释放第i列,进行下一次搜索            }        }}int main(){    int i;    for(i=1; i<=10; i++)    {        ans=0;        n=i;        memset(map,0,sizeof(map));        memset(visit,0,sizeof(visit));        dfs(1);        sol[i]=ans;    }    while(cin>>n&&n!=0)    {        cout<<sol[n]<<endl;    }    return 0;}//网上找的AC代码#include<stdio.h>#include<string.h>int n,tmp;int map[11];void DFS(int k){    int i,j,flag;    if(k==n+1)    {        tmp++;        return;    }    else    {        for(i=1;i<=n;++i)        {            map[k]=i;            flag=1;            for(j=1;j<k;++j)            {                if(map[j]==i||i-k==map[j]-j||i+k==map[j]+j)   // 注:1、i=map[k]  2、不在同一条斜线的两点的含义是行标到对角线的的距离不相等                {                    flag=0;                    break;                }            }            if(flag)                DFS(k+1);        }    }}int main(){    int m;    int ans[11];    for(n=1;n<=10;++n)    {        tmp=0;        DFS(1);        ans[n]=tmp;    }    while(scanf("%d",&m),m)    {        printf("%d\n",ans[m]);    }    return 0;}




运行结果:



知识点总结:
一道特别经典的DFS深度搜索题目。

学习心得:

我还是不会写DFS和BFS算法的应用,这道例题还是慢慢研究吧。。

0 0
原创粉丝点击