递归与分治思想:八皇后问题 (在此用递归) (回溯算法的典型题)
Posted zhenglijie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归与分治思想:八皇后问题 (在此用递归) (回溯算法的典型题)相关的知识,希望对你有一定的参考价值。
1 做法:第一步随便放一个棋子,然后找安全位置放第二个棋子,然后放好后再找安全地放第三个x棋子,以此类推 2 详细解释:https://www.bilibili.com/video/av76265320?from=search&seid=10595269197283770223 3 #include<stdio.h> 4 5 int count = 0; 6 int notdanger(int row, int j, int(*chess)[8]) 7 { 8 int i,k; 9 int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0; 10 11 for(i=0; i<8; i++) //判断列 12 { 13 if( *(*(chess+i)+j) != 0 ) 14 { 15 flag1 = 1; 16 break; 17 } 18 } 19 20 for(i=row,k=j; i>=0 && k<8; i--,k++)//判断右上方 21 { 22 if( *(*(chess+i)+k) != 0 ) 23 { 24 flag2 = 1; 25 break; 26 } 27 } 28 29 for(i=row,k=j; i<8 && k>=0; i++,k--)//判断左下方 30 { 31 if( *(*(chess+i)+k) != 0 ) 32 { 33 flag3 = 1; 34 break; 35 } 36 } 37 38 for(i=row,k=j; i<8 && k<8; i++,k++)//判断右下方 39 { 40 if( *(*(chess+i)+k) != 0 ) 41 { 42 flag4 = 1; 43 break; 44 } 45 } 46 47 for(i=row,k=j; i>=0 && k>=0; i--,k--)//判断左上方 48 { 49 if( *(*(chess+i)+k) != 0 ) 50 { 51 flag5 = 1; 52 break; 53 } 54 } 55 56 if(flag1 || flag2 || flag3 || flag4 || flag5) 57 { 58 return 0; 59 } 60 else 61 { 62 return 1; 63 } 64 } 65 //row表示起始行 66 //n表示总列数 67 //(*chess)[8]表示指向每一行的指针 68 void EightQueen(int row, int n, int(*chess)[8]) 69 { 70 int i,j,k; 71 int chess2[8][8]; 72 73 for(i=0; i<8; i++) 74 { 75 for(j=0; j<8; j++) 76 { 77 chess2[i][j] = chess[i][j]; 78 } 79 } 80 81 if(row == 8) 82 { 83 printf("这是第 %d 种 ",count+1); 84 for(i=0; i<8; i++) 85 { 86 for(j=0; j<8; j++) 87 { 88 printf("%d ",*(*(chess2+i)+j)); 89 } 90 printf(" "); 91 } 92 printf(" "); 93 count++; 94 } 95 else 96 { 97 for(k=0; k<n; k++) //判断此行每一个位置 八个位置都尝试一遍 98 { 99 if(notdanger(row,k,chess)) 100 { 101 for(i=0; i<8; i++) //回溯 102 { 103 *(*(chess2+row)+i) = 0; 104 } 105 *(*(chess2+row)+k) = 1; 106 107 EightQueen(row+1,n,chess2); //一行放完再放下一行 108 } 109 110 } 111 } 112 } 113 int main(void) 114 { 115 int chess[8][8]; 116 int i,j; 117 118 for(i=0; i<8; i++) 119 { 120 for(j=0; j<8; j++) 121 { 122 chess[i][j] = 0; 123 } 124 } 125 126 EightQueen(0,8,chess); 127 printf(" 一共有 %d 中摆法 ",count); 128 return 0; 129 }
以上是关于递归与分治思想:八皇后问题 (在此用递归) (回溯算法的典型题)的主要内容,如果未能解决你的问题,请参考以下文章