8皇后问题的两种解法。
无聊写写N皇后,一个是东软的时候写的,一个是昨天意林大神提醒写的位运算:
东软版记忆深度优先搜索:
#include <stdio.h> #define MAX 200 #define Empty 0 #define Full 1 #define N 8 unsigned char qipan[N][N][N]={MAX};//初始化8张棋盘表示每下一步的 void input(int i); int count = 0; int main() { input(0); getchar(); return 0; } void input(int i) { int x=0,y=0; int p=0,q=0; int flag = 0; //初始化当前棋盘 if(i!=0) { for(x=0;x<N;x++) { for(y=0;y<N;y++) { qipan[i][x][y] = qipan[i-1][x][y]; } } } else { for(x=0;x<N;x++) { for(y=0;y<N;y++) { qipan[i][x][y] = MAX; } } } //递归结束 if(i==N) { count++; for(x=0;x<N;x++) { for(y=0;y<N;y++) { printf("%d ",qipan[i-1][x][y]); } printf("\n"); } printf("%d\n",count); return; } for(y=0;y<N;y++) { //找到空位 if(qipan[i][i][y]==MAX) { //另其为1 qipan[i][i][y] = 1; //前后左右上下都置为0 for(p=0;p<N;p++) { for(q=0;q<N;q++) { if(q==y||p==i||(p-i)==(q-y)||(p-i)==(y-q)) if(qipan[i][p][q] == MAX) qipan[i][p][q] = 0; } } if(flag != -1) { //找下一个 input(i+1); } //将棋盘变回本层原样 for(p=0;p<N;p++) { for(q=0;q<N;q++) { if(i!=0) qipan[i][p][q] = qipan[i-1][p][q]; else qipan[i][p][q] = MAX; } } flag =0; } } //找不到空位结束 return; }
位运算:
1 #include <iostream> 2 int limit = 1; 3 int sum = 0; 4 void getnext(int col,int ld,int rd) 5 { 6 int t = limit&~(col|ld|rd); //limit限制位数,col为列上不能安放的位置,ld为左斜角不能安放的位置,rd为右斜角不能安放的位置 7 if(col == limit) 8 { 9 sum ++; 10 return; 11 } 12 while (t) 13 { 14 int x = t&-t; //这里一定要用&,自己写的时候忘记了用|,结果杯具了,用途是去到x的最右边的1. 15 getnext(col|x,(ld|x)<<1,(rd|x)>>1); 16 t = t-x; 17 } 18 } 19 int main() 20 { 21 int N = 0; 22 int map = 0; 23 scanf("%d",&N); 24 limit = (1<<N) -1; 25 getnext(0,0,0); 26 printf("%d",sum); 27 getchar(); 28 getchar(); 29 return 0; 30 }