博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ - 1321 棋盘问题 【dfs】
阅读量:1881 次
发布时间:2019-04-26

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

题意

类似皇后问题

思路

dfs,本题思路非常清晰了,唯一的问题是,怎么判断一个位置合法?

朴素的每一次标志防放置棋子的同行同列位置不合法是浪费严重的。

参考八皇后问题的优化,只需要标志一列是否放过即可(因为按行搜索不会出现一行放两个的问题)。

code

#include
#define endl '\n'using namespace std;int n,k;char mp[10][10];int vis[10];int ans;void dfs(int t,int k){
if(t==n+1||k==0){
if(k==0) ++ans; return; } dfs(t+1,k); for(int i=1;i<=n;i++){
if(mp[t][i]=='#'&&!vis[i]){
vis[i]=1; dfs(t+1,k-1); vis[i]=0; } } return;}int main(){
ios::sync_with_stdio(false); cin.tie(0); while(cin>>n>>k){
if(n==-1&&k==-1) break; for(int i=1;i<=n;i++) cin>>(mp[i]+1); ans=0; dfs(1,k); cout<
<

ps:更新

或许这种版本的回溯会更好理解一点

#include
#define endl '\n'using namespace std;int n,k;char mp[10][10];int vis[10];int ans;void dfs(int t){
if(t==n+1||k==0){
if(k==0) ++ans; return; } for(int i=1;i<=n;i++){
if(mp[t][i]=='#'&&!vis[i]){
vis[i]=1; //之后不能再找这一列了 k--; //放下一个棋子 dfs(t+1); //在这一行的某一列中有‘#’,直接转到下一行 vis[i]=0; //取消标记方便下一次查找不同的方案 k++; } } dfs(t+1); /如果上一行的列都没有‘#’,则换到下一行 return;}int main(){
ios::sync_with_stdio(false); cin.tie(0); while(cin>>n>>k){
if(n==-1&&k==-1) break; for(int i=1;i<=n;i++) cin>>(mp[i]+1); ans=0; dfs(1); cout<
<
学如逆水行舟,不进则退

转载地址:http://iylbf.baihongyu.com/

你可能感兴趣的文章
如果不能用Python执行机器学习,那该用什么呢?
查看>>
不论何时,互联网从业者一直幸福着~
查看>>
mysql用户口令中含有特殊字符@的情况下,如何正确链接数据库
查看>>
SpringFox接口文档API DOC
查看>>
netty优化策略
查看>>
架构师知识体系全景图
查看>>
guava中EventBus(事件总线)源码分析与使用
查看>>
程序员成神之路文章目录
查看>>
SASS软件的成熟度模型总结
查看>>
一次搞定redis使用
查看>>
最全架构设计实践方法论: 微服务
查看>>
Linux下简单几步安装AI开发环境-ROS(超有意思)
查看>>
epoll详解
查看>>
linux入门--磁盘管理之分区、格式化与挂载
查看>>
鸿蒙(二)基于小熊派实现LOT上云的智慧家居项目
查看>>
开发必备:HTTP 及 TLS
查看>>
Windows 11答疑:大家最关心的10个问题
查看>>
select、poll、epoll之间的区别
查看>>
Shopify!Shopify!Shopify!
查看>>
这是美国MarTech最大的一家独立公司:HubSpot
查看>>