之莫名其妙。。 #include <stdio.h> #include <stdlib.h> #define MAX_STACK_SIZE 15 void main() { unsigned int map[8][8] = {0}; int stack[MAX_STACK_SIZE]; int stack_p=-1; int i=0,j=0; int m,n; int count =0; //status int a[8] ={0},// a[i] 横 b[8] = {0}, //b[j] 纵 p[15] = {0},//撇方向,i+j ->p[i+j] 为同一斜线 q[15] ={0} ;//捺方向,i-j+7-> q[k] 从右上到左下 do { int flag = 0; while(i<8) {//列(j)不变,寻找合适的行(i)。 if (a[i] == 0 && p[i+j] == 0 && q[i-j+7] == 0) { stack[++stack_p] = i; a[i] = 1; b[j] = 1; map[i][j]=1; p[i+j] = 1; q[i-j+7] = 1; flag = 1; break; } else { i++; } } if (flag ==0) { int j_t = stack_p; int i_t = stack[stack_p--]; i = i_t+1; j--; if (j<0) break; a[i_t] = 0; b[j_t] = 0; map[i_t][j_t] = 0; p[i_t + j_t] = 0; q[i_t - j_t + 7] = 0; } else { if (j==7) { int j_t = stack_p; int i_t = stack[stack_p--]; for(m=0;m<8;m++) { for (n = 0; n<8; n++) { printf("%d",map[m][n]); } printf("/n"); } printf("/ncount=%d/n",++count); a[i_t] = 0; b[j_t] = 0; map[i_t][j_t] = 0; p[i_t + j_t] = 0; q[i_t - j_t + 7] = 0; i = i_t+1; } else { j++; i = 0; } } /*for(m=0;m<8;m++) { for (n = 0; n<8; n++) { printf("%d",map[m][n]); } printf("/n"); } printf("/n"); printf("j = %d/n",j);*/ }while (1); system("pause"); return; }