问题背景:八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后。为了达到这个目的, 任两个皇后都不能处于同一条横行、纵行或斜线上。
以下的代码给出的解法应该是最容易理解的一种方法,本问题还可以用回溯法和递归解决,理论上效率会比该方法好很多。
1 #include<stdio.h> 2 3 int chess[8][8]; 4 int count = 0; 5 6 void display(){ 7 int row,col; 8 for(row = 0; row < 8; row++){ 9 for(col = 0; col < 8; col++){ 10 if(chess[row][col] == 1){ 11 printf("%c ",45); 12 } 13 else if(chess[row][col] == 2){ 14 putchar(1); 15 printf("%c",32); 16 17 } 18 19 } 20 printf("\n"); 21 } 22 getch(); 23 } 24 void setLimitsArea(int row,int col){ 25 int i,j; 26 for(j = 0; j < 8; j++) 27 if(col != j) 28 chess[row][j] = 1; 29 for(i = 0; i < 8; i++) 30 if(row != i) 31 chess[i][col] = 1; 32 for(i = 1; row - i >= 0 && col - i >= 0; i++) 33 chess[row - i][col - i] = 1; 34 for(i = row + 1,j = col + 1; i < 8 && j < 8; i++,j++) 35 chess[i][j] = 1; 36 for(i = 1; row - i >= 0 && col + i < 8; i++) 37 chess[row - i][col + i] = 1; 38 for(i = row + 1,j = col - 1; i < 8 && j >=0; i++,j--) 39 chess[i][j] = 1; 40 } 41 void eightQueensProblem(){ 42 int row1,row2,row3,row4,row5,row6,row7,row8; 43 int i, j; 44 for(row1 = 0;row1 < 8;row1++){ 45 for(row2 = 0;row2 < 8;row2++){ 46 for(row3 = 0;row3 < 8;row3++){ 47 for(row4 = 0;row4 < 8;row4++){ 48 for(row5 = 0;row5 < 8;row5++){ 49 for(row6 = 0;row6 < 8;row6++){ 50 for(row7 = 0;row7 < 8;row7++){ 51 for(row8 = 0;row8 < 8;row8++){ 52 for(i = 0;i < 8;i++) 53 for(j = 0;j < 8;j++) 54 chess[i][j] = 0; 55 chess[0][row1] = 2; 56 setLimitsArea(0,row1); 57 if(chess[1][row2] == 0){ 58 chess[1][row2] = 2; 59 setLimitsArea(1,row2); 60 if(chess[2][row3] == 0){ 61 chess[2][row3] = 2; 62 setLimitsArea(2,row3); 63 if(chess[3][row4] == 0){ 64 chess[3][row4] = 2; 65 setLimitsArea(3,row4); 66 if(chess[4][row5] == 0){ 67 chess[4][row5] = 2; 68 setLimitsArea(4,row5); 69 if(chess[5][row6] == 0){ 70 chess[5][row6] = 2; 71 setLimitsArea(5,row6); 72 if(chess[6][row7] == 0){ 73 chess[6][row7] = 2; 74 setLimitsArea(6,row7); 75 if(chess[7][row8] == 0){ 76 chess[7][row8] = 2; 77 count = count + 1; 78 printf(" NO %d Method \n",count); 79 display(); 80 } 81 } 82 } 83 } 84 } 85 } 86 } 87 } 88 } 89 } 90 } 91 } 92 } 93 } 94 } 95 } 96 97 int main(){ 98 int row = 0,col = 0; 99 for(row = 0; row < 8; row++) 100 for(col = 0; col < 8; col++) 101 chess[row][col] = 0; 102 eightQueensProblem(); 103 return 0; 104 }
代码思路简介:setLimitArea的作用是当在chess[row][col]放置了皇后之后(该元素的值设置为2)。将该元素所在的行,所在的列,主对角线,和斜对角线上的元素都设置为1(原来整个数组元 素的值都为0),表示以后的皇后不可以放在这里。
eightQueensProblem函数对八个皇后的每一种放置方法(每行放置一个,每行从位置0到7尝试)进行判断。将符合的输出。
dispaly仅仅是打印函数,但是将表示放置了皇后的2在显示的时候显示为一个笑脸符号,将1表示为了一条线。