【奇偶剪枝】【HDU1010】Tempter of the Bone
2024-08-24 22:46:37
题意:输入一个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;
}
最新文章
- Bootstrap之栅格系统
- spring-hellow word
- 做完c语言作业的心得
- Yii里表单的操作方法(展示渲染待续......)
- select选择框内容左右移动添加删除栏(升级)
- “合规性”是考核IT运维的重要指标
- fatal: Not a git repository (or any of the parent directories): .git
- 利用LRUMap 设计缓存
- 【转】三十三、Android给ListView设置分割线Divider样式
- POJ 2142:The Balance_扩展欧几里得(多组解)
- ASP.NET交互Rest服务接口(Jquery的Get与Post方式)
- Java 多线程加锁的方式总结及对比(转载)
- fire workflow总结
- 为什么大多公司不要培训班出来的JAVA程序员?
- SpringMVC使用Burlap发布远程服务
- centos 7 配置tomcat开机启动
- Java+selenium 如何定位下拉框select
- Maven学习(六)maven使用中遇到的坑
- 【CF739E】Gosha is hunting 贪心
- 使用Github发布自己的网站