DFS Zoj 2110
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2110
//2110
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<cstdlib>
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<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<cstdlib>
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 <iostream>
#include <string.h>
#include <stdlib.h>
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"<<endl;
continue;
}
escape=0; //逃跑成功标志位,成功了为1,不成功为0
map[si][sj]='X';
dfs(si,sj,0); //从起点出开始深搜,此时时间为零
if (escape) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
DFS Zoj 2110的更多相关文章
- HDU 1010 Tempter of the Bone (ZOJ 2110) DFS+剪枝
传送门: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1010 ZOJ:http://acm.zju.edu.cn/onlinejudge/showPr ...
- ZOJ 2110 Tempter of the Bone(DFS)
点我看题目 题意 : 一个N×M的迷宫,D是门的位置,门会在第T秒开启,而开启时间小于1秒,问能否在T秒的时候到达门的位置,如果能输出YES,否则NO. 思路 :DFS一下就可以,不过要注意下一终止条 ...
- ZOJ 2110 Tempter of the Bone(条件迷宫DFS,HDU1010)
题意 一仅仅狗要逃离迷宫 能够往上下左右4个方向走 每走一步耗时1s 每一个格子仅仅能走一次且迷宫的门仅仅在t时刻打开一次 问狗是否有可能逃离这个迷宫 直接DFS 直道找到满足条件的路径 ...
- ZOJ 2110 DFS
狗要出门,且正好在T秒 就是DFS + 剪枝, 联系一下剪枝技巧 #include<iostream> #include<cstdio> #include<cstring ...
- zoj 2110 Tempter of the Bone (dfs)
Tempter of the Bone Time Limit: 2 Seconds Memory Limit: 65536 KB The doggie found a bone in an ...
- zoj 2110 很好的dfs+奇偶剪枝
//我刚开始竟然用bfs做,不断的wa,bfs是用来求最短路的而这道题是求固定时间的 //剪纸奇偶剪枝加dfs #include<stdio.h> #include<queue> ...
- DFS ZOJ 1002/HDOJ 1045 Fire Net
题目传送门 /* 题意:在一个矩阵里放炮台,满足行列最多只有一个炮台,除非有墙(X)相隔,问最多能放多少个炮台 搜索(DFS):数据小,4 * 4可以用DFS,从(0,0)开始出发,往(n-1,n-1 ...
- stack+DFS ZOJ 1004 Anagrams by Stack
题目传送门 /* stack 容器的应用: 要求字典序升序输出,所以先搜索入栈的 然后逐个判断是否满足答案,若不满足,回溯继续搜索,输出所有符合的结果 */ #include <cstdio&g ...
- ZOJ 2110 Tempter of the Bone
Tempter of the Bone Time Limit: 2 Seconds Memory Limit: 65536 KB The doggie found a bone in an ...
随机推荐
- cocos2d中如何使用图片纹理图集的加载来实现一个动画的功能
cocos2d中要实现一个动画,一般采用纹理图集的方式,也就是说把几个连续动作的图片挨个显示切换这样就是动画 一: 首先先看下今天要实现的具体的目的,打飞机的时间屏幕上会有一个喷火的小飞机,飞机的尾部 ...
- wpf 自定义RadioButton控件样式
实现的效果为: 我感觉来自定义RadioButton样式和定义button空间的样式差不多,只是类型不同而已. 接下来分析一下样式代码: <!--自定义单选按钮样式--> & ...
- ExtJs 第二章,Ext.form.Basic表单操作
1.认识Ext.form.Panel表单面板 Ext.form.field.CheckBox 复选框 checkboxfield Ext.form.CheckBoxGroup 复选框组 ...
- iOS 数据持久性存储-属性列表
iOS上常用四种数据存取方法有: 1.属性列表 2.对象归档 3.iOS的嵌入式关系数据库(SQLite3) 4.苹果公司提供持久性共聚Core Data 由于苹果公司的沙盒机制,每个应用程序都有自己 ...
- Mvvm绑定datagrid或listview的selectItems的方法[转]
单选,很简单,将SelectedItem与ViewModel的属性进行双向绑定就OK了 多选,由于ListView的SelectedItems不能进行绑定,需要将ListView的SelectionC ...
- 装了SVN,你的关联图标变了没有?
装了SVN,你的关联图标变了没有? 开始合作之后,装上了SVN,非常高效,我在VS写了一部分的代码,上传之后,别人通过下载或是更新,就更新到了合作同伴的VS里,相当于大家在一个VS里写代码.和保强他们 ...
- ThinkPHP框架下,给jq动态添加的标签添加点击事件移除标签
jq移除标签主要就是$("#要移除的id").remove();不再赘述,这里要提醒的是jq中动态添加标签后怎样添加点击事件.一般的jq添加点击事件是用这种方法$("#i ...
- 新一代的代码编辑神器Sublime Text 3(使用指南)
首先附上官网下载链接:http://www.sublimetext.com/3 接下来是安装sublime最强大的插件功能:Package Control 一.简单的安装方法 使用Ctrl+`快捷键或 ...
- 检测js代码是否已加载的判断代码
该方法不局限于jQuery的检测,对与任何Javascript变量或函数都是通用的. 当前网页加载jQuery后,jQuery()或$()函数将会被定义,所以检测jQuery是否已经加载存在以下2种方 ...
- truncate 命令删除恢复
truncate命令可以一次性删除当前表中所有记录并且不留任何日志,同时这个表的ID就自动初化从1开始,今天我就来给大家尝试一个利用truncate清除记录之后恢复过程. 实际线上的场景比较复杂,当时 ...