uva11214 守卫棋盘 —— 迭代加深搜
来源:互联网 发布:美丽笨女人歌曲 知乎 编辑:程序博客网 时间:2024/06/05 01:57
代码如下:
#include<cstdio>//守卫棋盘uva11214 迭代加深搜#include<cstring>/*不用迭代加深搜的话,搜索将从第一开开始,到最后一个开始,而且深度不确定,要用min去记录最小个数,搜索量可怕,而加深搜因为最大深度一次递增,所以第一个符合的即为最小*/#define maxn 11using namespace std;bool g[maxn][maxn], vis[4][maxn*2];int n,m,maxd;bool guard()//判断是否全保卫{ for(int i = 0; i<n; i++) for(int j = 0; j<m; j++) //如果是目标,且四个方向都没有保护,则失败。 这种判断方法值得学习 if(g[i][j] && !vis[0][i] && !vis[1][j] && !vis[2][i+j] && !vis[3][maxn+i-j]) return false; return true;}bool dfs(int i,int j,int d){ if(d==maxd)//当深度达到maxd,判断是否全保卫 { if(guard()) return true; else return false; } for(; i<n; i++) { int t1,t2,t3,t0; for(; j<m; j++) { t0=vis[0][i], t1=vis[1][j], t2=vis[2][i+j], t3=vis[3][maxn+i-j]; vis[0][i] = vis[1][j] = vis[2][i+j] = vis[3][maxn+i-j] = true; if(dfs(i,j+1,d+1)) return true; //把dfs放到判断中,如果符合,则直接退出,不符合,则下一个循环 vis[0][i]=t0, vis[1][j]=t1, vis[2][i+j]=t2, vis[3][maxn+i-j]=t3; } } return false;}int main(){ while(scanf("%d%d",&n,&m)==2 && m && n) { memset(g,0,sizeof(g)); for(int i = 0; i<n; i++) { getchar(); for(int j = 0; j<m; j++) { if(getchar()=='X') g[i][j] = true; } } for(maxd = 1; ;maxd++) { memset(vis,0,sizeof(vis)); if(dfs(0,0,0)) break; } printf("%d\n",maxd); } return 0;}
0 0
- uva11214 守卫棋盘 —— 迭代加深搜
- 习题7-10:守卫棋盘(dfs迭代加深)
- 棋盘染色(迭代加深搜索)
- 迭代加深搜索——PQJ2286
- 【日常学习】【迭代加深搜索】codevs1049 棋盘染色题解
- 【五子棋AI】启发算法——迭代加深与内部迭代加深
- 迭代加深搜搜索
- 埃及分数——迭代加深搜索
- 迭代加深搜索——POJ 3134
- 埃及分数(迭代加深搜)
- 【sgu510】迭代加深
- 迭代加深+剪枝
- 迭代加深
- 迭代加深搜索
- 迭代加深
- 迭代加深搜索
- 搜索-迭代加深
- UVA - 11214(迭代加深)
- 数据模型
- 杭电2031 进制转换
- CXF生成webservice服务端,httpclient客户端调用webservice服务端
- 安卓之旅第二站--常用UI界面设计
- 总结对比下这些包管理器以及流行框架 rvm npm
- uva11214 守卫棋盘 —— 迭代加深搜
- js获取父辈元素 获取 父辈上级元素
- Android开源库SlideMenu如何实现沉浸式效果
- 可能是最白话的C语言指针介绍
- React的数据载体state、props与context
- 【Mybatis】自动生成代码工具
- 实体以及实体型和实体集
- POJ3273:Monthly Expense(二分)
- java字符串连接性能分析