回溯经典问题之八皇后问题
1 #include "stdio.h" 2 #include "stdlib.h" 3 4 // using back tracking solve the problem 5 6 int N = 8; 7 8 int a[N]={0}, b[2*N-1]={0}, c[2*N-1]={0}; 9 char queen[N]; 10 /* 11 * a[col-1] 记录第 col 列有无皇后, 1 表示有。 12 * b[row+col-2] 记录从左上数第 row+col-1 条斜率为 1 的线上有无皇后。 13 * c[row-col+7] 记录从右上数第 row-col+8 条斜率为 -1 的线上有无皇后。 14 * queen[i] 记录棋盘上第 i 行 皇后所在列 15 */ 16 17 18 int Num = 0; //记录解法数 19 int row; 20 void print() 21 { 22 23 printf("\n 解法 %d :\n",++Num); 24 int i=0,j=0; 25 for(i=0;i<N;i++) 26 { 27 for(j=0;j<N;j++) 28 if(queen[i]==j) 29 printf("Q\t"); 30 else 31 printf(".\t"); 32 printf("\n"); 33 } 34 } 35 void BackTrack (int row) 36 { 37 if(row >N ) 38 print(); 39 for (int col=1; col<=N; col++) 40 { 41 if (a[col-1] + b[row+col-2] + c[row-col+N-1] == 0) 42 { 43 a[col-1] = 1; 44 b[row+col-2] = 1; 45 c[row-col+N-1] = 1; 46 47 queen[row-1] = col-1; 48 BackTrack (row + 1); 49 50 a[col-1] = 0; 51 b[row+col-2] = 0; 52 c[row-col+N-1] = 0; 53 54 } 55 } 56 } 57 58 59 60 61 int main () 62 { 63 BackTrack(1); 64 printf("\n 总共有 %d 解法 \n",Num); 65 return 0; 66 }