八皇后问题
八皇后问题:
- 在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; }