cheng_you_know

学而时习之!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2553

N皇后问题是搜索中的经典问题,在N*N的棋盘上放N个皇后,使得每行每列每条对角线上没有两个棋子。

#include <iostream>
using namespace std;
int visit[11];  //记录行是否有遍历过
int line_map[11]; //记录每行,占的列位置
int count;
void dfs(int k ,int n)
{
    int flag = 0;
    if(k == n+1)
    {
        count++;
        return ;
    }
    for(int j=1;j<=n;j++)
    {
        if(visit[j]==0) //not visit;make sure the two point will not in direct line 
        {
            line_map[k] = j;
            flag = 0;
            for(int i = 1; i<k ;i++)  //循环前k-1个是否有违反规则的
            {
                if(abs(line_map[k]-line_map[i]) == abs(k-i)) //是否在一条斜线上
                {
                    flag = 1;
                    break;
                }
            }
            if(flag ==0)
            {
                visit[j] = 1;
                dfs(k+1,n);
                visit[j] = 0; //回溯
            }
        }
    }
}
int main()
{
    int i,j,n;
    int ans[11];
    for(i =1 ;i<11;i++)
    {
        memset(visit,0,sizeof(visit));
        memset(line_map,0,sizeof(line_map));
        count = 0;
        dfs(1,i);
        ans[i] = count;
    }
    while(scanf("%d",&n),n)
    {
        printf("%d\n",ans[n]);
    }
    return 0;
}
posted on 2013-05-29 19:16  cheng_you_know  阅读(150)  评论(0编辑  收藏  举报