N皇后问题

N皇后问题

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

Font: Times New Roman | Verdana | Georgia

Font Size:  

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

Author

cgf

Source

2008 HZNU Programming Contest
数据比较小,直接搜索吧,标记地图用累加的即可,因为结果是唯一的,所有把搜索的结果都保存在数组中,直接输出、
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 int D,SIGN;
 5 int Map[12][12];
 6 
 7 void Sign_Part1(int i,int j,int D)
 8 {
 9     int ii,jj;
10     for(ii=0;ii<D;ii++)
11        if(ii!=j) Map[i][ii]+=1;
12     for(jj=0;jj<D;jj++)
13         if(jj!=i)Map[jj][j]+=1;
14     for(ii=0;i-ii>=0&&j-ii>=0;ii++)
15         if(i-ii!=i&&j-ii!=j)Map[i-ii][j-ii]+=1;
16     for(ii=0;i+ii<D&&j+ii<D;ii++)
17         if(i+ii!=i&&j+ii!=j)Map[i+ii][j+ii]+=1;
18     for(ii=0;i-ii>=0&&j+ii<D;ii++)
19         if(i-ii!=i&&j+ii!=j)Map[i-ii][j+ii]+=1;
20     for(ii=0;i+ii<D&&j-ii>=0;ii++)
21         if(i+ii!=i&&j-ii!=j)Map[i+ii][j-ii]+=1;
22     Map[i][j]+=1;
23   /* for(ii=0;ii<D;ii++)
24     {
25         for(jj=0;jj<D;jj++)
26             printf("%d ",Map[ii][jj]);
27         putchar('
');
28     }
29     putchar('
');
30     getch();*/
31 }
32 
33 void Sign_Part2(int i,int j,int D)
34 {
35     int ii,jj;
36     for(ii=0;ii<D;ii++)
37        if(ii!=j) Map[i][ii]-=1;
38     for(jj=0;jj<D;jj++)
39         if(jj!=i)Map[jj][j]-=1;
40     for(ii=0;i-ii>=0&&j-ii>=0;ii++)
41         if(i-ii!=i&&j-ii!=j)Map[i-ii][j-ii]-=1;
42     for(ii=0;i+ii<D&&j+ii<D;ii++)
43         if(i+ii!=i&&j+ii!=j)Map[i+ii][j+ii]-=1;
44     for(ii=0;i-ii>=0&&j+ii<D;ii++)
45         if(i-ii!=i&&j+ii!=j)Map[i-ii][j+ii]-=1;
46     for(ii=0;i+ii<D&&j-ii>=0;ii++)
47         if(i+ii!=i&&j-ii!=j)Map[i+ii][j-ii]-=1;
48     Map[i][j]-=1;
49 }
50 
51 int Put_Chese(int x,int d,int D)
52 {
53     int i;
54     if(d==D){SIGN+=1;return 1;}
55     if(x+1>=D)return 0;
56     for(i=0;i<D;i++)
57     {
58         if(Map[x+1][i]==0)
59         {
60             Sign_Part1(x+1,i,D);
61             Put_Chese(x+1,d+1,D);
62             Sign_Part2(x+1,i,D);
63         }
64     }
65     return 0;
66 }
67 
68 int main()
69 {
70     int i,j,NUM[11];
71     D=1;
72     while(D)
73     {
74         if(D==11)break;
75         SIGN=0;
76         memset(Map,0,sizeof(Map));
77         for(i=0;i<D;i++)
78         {
79             Sign_Part1(0,i,D);
80             Put_Chese(0,1,D);
81             Sign_Part2(0,i,D);
82         }
83         NUM[D]=SIGN;
84         D++;
85     }
86 
87     while(scanf("%d",&j),j)
88         printf("%d
",NUM[j]);
89     return 0;
90 }
View Code

修改:2015.5.8

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 using namespace std;
 5 int N,SUM;
 6 int Map[12][12];
 7 void Cread_()
 8 {
 9     for(int i=0;i<=N+1;i++)
10     {
11         for(int j=0;j<=N+1;j++)
12         {
13             if(i==0||j==0||i==N+1||j==N+1)Map[i][j]=-1;
14             else Map[i][j]=0;
15         }
16     }
17     return ;
18 }
19 void Deal(int x,int y,int sign)
20 {
21     int i,j;
22     Map[x][y]+=sign;
23     for(i=1;Map[x][y-i]!=-1;i++)Map[x][y-i]+=sign;
24     for(i=1;Map[x][y+i]!=-1;i++)Map[x][y+i]+=sign;
25     for(i=1;Map[x+i][y]!=-1;i++)Map[x+i][y]+=sign;
26     for(i=1;Map[x-i][y]!=-1;i++)Map[x-i][y]+=sign;
27 
28     for(i=1;Map[x-i][y-i]!=-1;i++)Map[x-i][y-i]+=sign;
29     for(i=1;Map[x-i][y+i]!=-1;i++)Map[x-i][y+i]+=sign;
30     for(i=1;Map[x+i][y-i]!=-1;i++)Map[x+i][y-i]+=sign;
31     for(i=1;Map[x+i][y+i]!=-1;i++)Map[x+i][y+i]+=sign;
32 }
33 
34 void BFS(int x)
35 {
36     int i,j;
37     if(x==N+1)
38     {
39         SUM++;
40     }
41     for(j=1;j<=N;j++)
42     {
43         if(Map[x][j]==0)
44         {
45             Deal(x,j,1);
46             BFS(x+1);
47             Deal(x,j,-1);
48         }
49     }
50 }
51 int main()
52 {
53     int i;
54     int Sum[11];
55     for(N=1;N<=10;N++)
56     {
57         SUM=0;Cread_();
58         for(i=1;i<=N;i++)
59         {
60             if(Map[1][i]==0)
61             {
62                 Deal(1,i,1);
63                 BFS(2);
64                 Deal(1,i,-1);
65             }
66         }
67         Sum[N]=SUM;
68     }
69     while(scanf("%d",&N)!=EOF)
70     {
71         if(N==0)break;
72 
73         printf("%d
",Sum[N]);
74     }
75     return 0;
76 }
View Code

转载请备注:
**************************************
* 作者: Wurq
* 博客: https://www.cnblogs.com/Wurq/
* Gitee: https://gitee.com/wurq
**************************************
原文地址:https://www.cnblogs.com/Wurq/p/3750326.html