题意:输入一个n*m的迷宫,和一个T:可以在迷宫中生存的最大时间。S为起点,D为终点。并且,每个格子只能踩一次,且只能维持一秒,然后该块地板就会塌陷。所以你必须每秒走一步,且到D点时,所用时间为T。

TIPS:可以在中途某个点就能通过x+y的奇偶性与剩余时间的奇偶性判定  能否到D ,达到剪枝的目的。

代码如下

#include <cstdio>
#include <cstring>
#include <iostream>
#include <stdlib.h>
using namespace std;
char map[9][9];
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
int n,m,t,sum;
int sx,sy,ddx,ddy;
bool dfs(int x,int y,int time)
{
int px,py;
if(x==ddx && y==ddy && time==t)
{
return true;
}
else
{
if(abs(ddx-x)+abs(ddy-y)>t-time)return false;
for(int i=0;i<4;i++)
{
px=x+dx[i];
py=y+dy[i];
if(map[px][py]!='X' && time+1<=t)
{
map[px][py]='X';
if(dfs(px,py,time+1))return true;
map[px][py]='.';
}
}
}
return false;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&t),n || m || t)
{
memset(map,'X',sizeof(map));
sum=0;
getchar();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='S')
{
sx=i;
sy=j;
}
if(map[i][j]=='D')
{
ddx=i;
ddy=j;
}
if(map[i][j]=='.')sum++;
}
getchar();
}
if(sum+1<t || (t+sx+sy+ddx+ddy)%2==1)printf("NO\n");
else
{
map[sx][sy]='X';
if(dfs(sx,sy,0))printf("YES\n");
else printf("NO\n");
}
}
return 0;
}

最新文章

  1. Bootstrap之栅格系统
  2. spring-hellow word
  3. 做完c语言作业的心得
  4. Yii里表单的操作方法(展示渲染待续......)
  5. select选择框内容左右移动添加删除栏(升级)
  6. “合规性”是考核IT运维的重要指标
  7. fatal: Not a git repository (or any of the parent directories): .git
  8. 利用LRUMap 设计缓存
  9. 【转】三十三、Android给ListView设置分割线Divider样式
  10. POJ 2142:The Balance_扩展欧几里得(多组解)
  11. ASP.NET交互Rest服务接口(Jquery的Get与Post方式)
  12. Java 多线程加锁的方式总结及对比(转载)
  13. fire workflow总结
  14. 为什么大多公司不要培训班出来的JAVA程序员?
  15. SpringMVC使用Burlap发布远程服务
  16. centos 7 配置tomcat开机启动
  17. Java+selenium 如何定位下拉框select
  18. Maven学习(六)maven使用中遇到的坑
  19. 【CF739E】Gosha is hunting 贪心
  20. 使用Github发布自己的网站

热门文章

  1. Mac 下纯lua(二)
  2. linux查看用户登录信息2-who命令
  3. Ext布局
  4. background小结
  5. 详解AJAX核心 —— XMLHttpRequest 对象 (上)
  6. VS2010 配置 DirectX 开发环境
  7. Perfect Squares
  8. vs2012配置opencv及简单测试
  9. linux学习笔记之线程
  10. PHP搭建(windows64+apache2.4.7+mysql-5.6+php5.5)