回溯算法的模型是 x++, not satisfy ? x-- : continue.
代码中x作列号,y[x]保存第x列上皇后放置的位置。
1 #include<stdio.h> 2 #include<math.h> 3 #define N 5 4 int position_check(int,int*); 5 void print_board(int count,int* y); 6 int main() 7 { 8 int y[N]= {0}; //记录每列上的皇后放的位置 9 int count = 0; //解的个数 10 int x = 1; 11 while(x>0) 12 { 13 y[x]++; //为当前x位置找一个皇后的位置 14 while((y[x]<=N) && !position_check(x,y)) 15 y[x]++; //找到合适的皇后 16 // 17 if(y[x]<=N)//找到一个可以放置第x个皇后的位置,到该步为止,所求部分解都满足要求 18 { 19 if(x==N)//找到一个完整的放置方案 20 { 21 count++; 22 printf("%d\n",count); 23 for( int i=1; i<=N; i ++ ) 24 { 25 for( int j=1; j<=N; j++ ) 26 if( j==y[i] ) printf("x ");//如果该位置放了皇后则显示x 27 else printf("o "); 28 printf("\n"); 29 } 30 } 31 else 32 x++; //继续寻找下一个皇后的位置,还没找到完整解决方案 33 } 34 else//未找到可以放置第x个皇后的位置,到该步为止,已经知道不满足要求 35 { 36 y[x] = 0;//因为要回溯,下一次是寻找第x-1个皇后的位置, 37 //在下一次确定x-1的位置之后,第x个皇后的开始搜索的位置要重置 38 x--; //回溯 39 } 40 } 41 } 42 int position_check(int k,int* y) //测试合法性 43 { 44 for(int j = 1; j < k; j++) 45 if((abs(k-j) == abs(y[j] - y[k]))||(y[j] == y[k])) 46 return 0; 47 return 1; 48 }
看了唐大仕老师的8皇后改的,基本是复制粘贴 ( ╯□╰ )
时间: 2024-10-28 01:41:31