博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DFS Zoj 2110
阅读量:5827 次
发布时间:2019-06-18

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

 
//2110#include
#include
#include
#include
#include
using namespace std;int n, m, t, di, dj, flag;char map[10][10];int dir[4][2]={
{0, 1}, {1, 0}, {0, -1}, {-1, 0}};void dfs(int si, int sj, int cnt){ int i, xx, yy; if(si<=0||sj<=0||si>n||sj>m) return ; if(si==di&&sj==dj&&cnt==t) { flag=1; return ; } int temp=t-cnt-abs(si-di)-abs(sj-dj); if(temp<0 || temp%2) return ; for(i=0; i<4; i++) { xx=si+dir[i][0], yy=sj+dir[i][1]; if(map[xx][yy]!='X') { map[xx][yy]='X'; dfs(xx, yy, cnt+1); if(flag) return; map[xx][yy]='.'; } } return ;} int main(){ int i, j, si, sj; while(scanf("%d%d%d", &n, &m, &t)!=EOF) { if(n==0&&m==0&&t==0) break; memset(map, 0, sizeof(map)); int wal=0; char temp; scanf("%c", &temp); for(i=1; i<=n; i++) { //scanf("%s%*c", map[i]); for(j=1; j<=m; j++) { scanf("%c", &map[i][j]); if(map[i][j]=='S') si=i, sj=j; else if(map[i][j]=='D') di=i, dj=j; else if(map[i][j]=='X') wal++; } scanf("%c", &temp); } if(n*m-wal<=t) { printf("NO\n"); continue; } flag=0; map[si][sj]='X'; dfs(si, sj, 0); if(flag) printf("YES\n"); else printf("NO\n"); } return 0;} ****************************************#include
#include
#include
#include
#include
using namespace std;int n, m, t, dx, dy, flag;char map[10][10];int dir[4][2]={ {0, 1}, {1, 0}, {0, -1}, {-1, 0}};void dfs(int x, int y, int step){ int i, xx, yy; if(x<=0||y<=0||x>n||y>m) return ; if(x==dx&&y==dy&&step==t) { flag=1; return ; } int temp=t-step-abs(x-dx)-abs(y-dy); if(temp<0 || temp%2) return ; for(i=0; i<4; i++) { xx=x+dir[i][0], yy=y+dir[i][1]; if(map[xx][yy]!='X') { map[xx][yy]='X'; dfs(xx, yy, step+1); if(flag) return; map[xx][yy]='.'; } } return ;} int main(){ int i, j, x, y; while(scanf("%d%d%d", &n, &m, &t)!=EOF) { if(n==0&&m==0&&t==0) break; memset(map, 0, sizeof(map)); int wal=0; char temp; scanf("%c", &temp); for(i=1; i<=n; i++) { //scanf("%s%*c", map[i]); for(j=1; j<=m; j++) { scanf("%c", &map[i][j]); if(map[i][j]=='S') x=i, y=j; else if(map[i][j]=='D') dx=i, dy=j; else if(map[i][j]=='X') wal++; } scanf("%c", &temp); } if(n*m-wal<=t) { printf("NO\n"); continue; } flag=0; map[x][y]='X'; dfs(x, y, 0); if(flag) printf("YES\n"); else printf("NO\n"); } return 0;}

  

// zoj  2110#include 
#include
#include
using namespace std;char map[9][9]; //迷宫地图int n,m,t; //迷宫的大小,及迷宫的门会在第t秒开启 int di,dj; //(di,dj):门的位置 bool escape;int dir[4][2]={
{0,-1},{0,1},{1,0},{-1,0}};//控制行走方向 左 右 下 上void dfs(int si,int sj,int cnt) //已经到达(si, sj)位置 且已经花费cnt秒{ int i,temp; if (si>n||sj>m||si<=0||sj<=0) return; //起点不再矩阵之内。返回 //边界 if (cnt==t&&si==di&&sj==dj) escape=1;// 起点在门处,且门在零秒的时候开启,成功逃生 if (escape) return; temp=(t-cnt)-abs(si-di)-abs(sj-dj);// if (temp<0||temp&1) return; //temp<0是最短距离小于时间的剪枝,temp&1是奇偶剪枝,还有一种写法,temp%2!=0; for (i=0;i<4;i++) { if (map[si+dir[i][0]][sj+dir[i][1]]!='X')//如果该方格是可以通过的,跳到此空格进行操作 { map[si+dir[i][0]][sj+dir[i][1]]='X';//设置志。变为不可通过,表明已经搜过 dfs(si+dir[i][0],sj+dir[i][1],cnt+1); //从此点开始递归 map[si+dir[i][0]][sj+dir[i][1]]='.'; //递归完,将该点还原 } } return;}int main(){ int i,j ; //循环变量 int si,sj; //小狗的起始位置 while (cin>>n>>m>>t) { if (n==0&&m==0&&t==0) break;//测试数据结束 int wall=0; for (i=1;i<=n;i++) for (j=1;j<=m;j++) { cin>>map[i][j]; if (map[i][j]=='S') { si=i; //记录起点位置 sj=j; } else if (map[i][j]=='D') { di=i; //记录门位置 dj=j; } else if (map[i][j]=='X') wall++; //wall 为不能穿越的方格的个数 } if (n*m-wall<=t) //可以走的个数少于等于时间,说明即使全部走,也不能刚好在t时间到达门 { cout<<"NO"<

  

 

转载于:https://www.cnblogs.com/wc1903036673/p/3461272.html

你可能感兴趣的文章
float数据在内存中是怎么存储的
查看>>
dedecms 修改标题长度可以修改数据库
查看>>
Matplotlib学习---用matplotlib画直方图/密度图(histogram, density plot)
查看>>
MySQL案列之主从复制出错问题以及pt-slave-restart工具的使用
查看>>
linux 查看剩余内存数
查看>>
测试人员容易遗漏的隐藏缺陷
查看>>
maven+SpringMVC搭建RESTful后端服务框架
查看>>
一本书的摘录
查看>>
重排序(转载)
查看>>
python+selenium之字符串切割操作
查看>>
串结构练习——字符串匹配
查看>>
linux下输入密码不回显
查看>>
《构建之法》读书笔记
查看>>
拿下阿里、头条、滴滴的offer后谈谈面试经验---动身前看一看
查看>>
android开发(49) android 使用 CollapsingToolbarLayout ,可折叠的顶部导航栏
查看>>
【ERP】如何在多行数据块中实现仅能勾选唯一的主联系人
查看>>
Oracle 数据库优化的R方法(Method R)
查看>>
CentOS最小化安装系统开启网卡
查看>>
互联网+升级到智能+ 开启万物智联新时代
查看>>
Linux文本编辑器之Nano
查看>>