博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
N皇后问题--递归回溯
阅读量:5298 次
发布时间:2019-06-14

本文共 1332 字,大约阅读时间需要 4 分钟。

著名的N皇后问题,就是先按照行一行一行的找,先找第一行,第一行找到一列能满足条件,继续找下一行,如果下一行也找到一列能满足条件,继续找下一行,一次类推,最终找到解, 但是,如果找不到的话, 就说明上一行放的位置错误, 所以回溯到上一行中,继续找下一列,如果找不到,继续回溯,大体就是这么执行找到解的。

下面是代码:

1 #include 
2 3 const int MAX = 30; 4 int n; 5 int a[MAX];//保存当前列值 6 int vis1[MAX];//标记当前列 7 int vis2[MAX];//标记副对角线 8 int vis3[MAX];//标记主对角线 9 int cnt;10 void dfs(int cur)11 {12 if(cur == n)//如果找完了,打印出来 13 {14 for(int i = 0; i < n; i++)15 printf("%d ", a[i]);16 printf("\n");17 cnt++;18 return;19 }20 int i = cur + 1;//此时是按照行来找的,所以直接遍历列就行 21 for(int j = 1; j <= n; j++)22 {23 //如果列,主对角线,副对角线都满足条件,就能放 24 if(vis1[j] == 0 && vis2[i + j] == 0 && vis3[i - j + 14] == 0)25 {26 //标记 27 vis1[j] = 1;28 vis2[i + j] = 1;29 vis3[i - j + 14] = 1;30 //如果满足条件,就将当前的列值给到a数组中 31 a[cur] = j;32 //找下一列 33 dfs(cur + 1);34 //取消标记, 35 vis1[j] = 0;36 vis2[i + j] = 0;37 vis3[i - j + 14] = 0;38 }39 40 }41 }42 int main()43 {44 while(~scanf("%d", &n))45 {46 cnt = 0;47 dfs(0);48 printf("%d\n", cnt);//统计总数 49 }50 return 0;51 }

 

转载于:https://www.cnblogs.com/Howe-Young/p/4066525.html

你可能感兴趣的文章
iOS开发日记6-跳转appStore评分
查看>>
SpringBoot war包部署到Tomcat服务器
查看>>
对缓存的思考——提高命中率
查看>>
让静态页面显示用户登录状态
查看>>
K-means算法
查看>>
input提示文字;placeholder字体修改
查看>>
MyBatis知识点总结(一)
查看>>
面试题链接记录
查看>>
Android Studio 版本间区别
查看>>
SQL SERVER: 合并相关操作(Union,Except,Intersect)
查看>>
1025-完数
查看>>
汇编第二章知识总结
查看>>
负载均衡简单配置
查看>>
Informix Online数据库日常管理及维护
查看>>
Java反射机制demo(二)—通过Class实例化任意类的对象
查看>>
String和StringBuffer的区别
查看>>
eclipse 添加resources 目录
查看>>
shell 备份mysql
查看>>
ios 常见问题解决
查看>>
Gradle初使用
查看>>