递归与分治思想:八皇后问题 (在此用递归) (回溯算法的典型题)
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 种\n",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("\n"); 91 } 92 printf("\n"); 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("\n一共有 %d 中摆法\n",count); 128 return 0; 129 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端