八皇后问题

八皇后问题:

  • 在8*8的国际象棋棋盘上摆放8个皇后,使其不能互相攻击
  • 即:任意两个皇后不能在同行同列或同斜线,问有多少种摆法?

我的代码:(写了半天还很水。。。最重要的是感觉是写对了)

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #define N 8
 5 using namespace std;
 6 int Q[N+1],count=1;
 7 void printQ()
 8 {//cout<<"第"<<count++<<"种"<<endl;
 9     int i,j;
10     for(i=1;i<=N;i++)
11     {
12         for(j=1;j<=N;j++)
13         if(i==Q[j]) printf("%d ",i);
14         else printf("+ ");
15         printf("\n");
16     }printf("----------------\n");
17 }
18 void queen8(int x)
19 {
20     int i,j;
21     if(x>N) {printQ(); return ;}
22     for(i=1;i<=N;i++)
23     {
24         if(!Q[i])
25         {
26             for(j=1;j<=N;j++)
27             {
28                 if(!Q[j]) continue;
29                 if((i-j==x-Q[j])||(i-j==Q[j]-x) )break ;
30             }
31             if(j>N){Q[i]=x;queen8(x+1);Q[i]=0;}
32         }
33     }
34 
35 }
36 int main()
37 {
38     //freopen("G://1.txt","w",stdout);
39     memset(Q,0,sizeof(Q));
40     queen8(1);
41     return 0;
42 }

 

 

 另一种课上PPT给的代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cmath>
#define N 8
using namespace std;
int Q[N+1],count=1;
void printQ()
{//cout<<"第"<<count++<<"种"<<endl;
    int i,j;
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=N;j++)
        if(i==Q[j]) printf("%d ",i);
        else printf("+ ");
        printf("\n");
    }printf("----------------\n");
}
bool Bound(int k)
{
    for(int i=1;i<k;i++)
    {
        if((fabs(k-i)==fabs(Q[k]-Q[i]))||(Q[i]==Q[k]))
        return false;
    }
    return true;
}
void Backtrack(int t)
{
    if(t>N) printQ();
    else{
        for(int i=1;i<=8;i++){
            Q[t]=i;
            if(Bound(t)) Backtrack(t+1);
        }
    }
}
int main()
{
    freopen("G://2.txt","w",stdout);
    memset(Q,0,sizeof(Q));
    Backtrack(1);
    return 0;
}

  

posted on 2016-03-04 20:57  小菜的爱  阅读(275)  评论(0编辑  收藏  举报

导航