八皇后问题:
- 在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(" "); 16 }printf("---------------- "); 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("
");
}printf("----------------
");
}
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;
}