hdu1010
来源:互联网 发布:windows无法正常启动 编辑:程序博客网 时间:2024/06/10 18:43
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010
先说下这个题的坑:
1)要求是正好的时间到达,因为这个坑了很多次WA。。
2)减枝。一个是算最短路径都大于给定时间的,一个是奇偶性的问题,比如(0,0)点到了(1,1)要走偶数步,而到(0,1)要走奇数步,判断一下题目给的时间是否符合,还有一个是dfs写的时候是到达了门那个点就要退出。。 三个剪枝缺一不可。。。
代码:
#include <cstdio>
#include <cstring>
int n,m,t,ans;
int startx,starty,endx,endy;
char map[10][10];
int v[10][10];
int next[5][2] = { {-1,0}, //上
{0,1}, //right
{1,0}, //down
{0,-1} // left
};
int flag;
int Abs(int n)
int next[5][2] = { {-1,0}, //上
{0,1}, //right
{1,0}, //down
{0,-1} // left
};
int flag;
int Abs(int n)
{
return n > 0 ? n : -n;
}
void dfs(int x,int y,int dis)
return n > 0 ? n : -n;
}
void dfs(int x,int y,int dis)
{
if(x == endx && y == endy)
{
if(dis == t)
flag = 1;
return ;
}
if(x == endx && y == endy)
{
if(dis == t)
flag = 1;
return ;
}
for(int i = 0;i < 4;++i)
{
int tx = x + next[i][0];
int ty = y + next[i][1];
if(tx < 0 || tx > n - 1 || ty < 0 || ty > m - 1 || map[tx][ty] == 'X')
continue;
if(!v[tx][ty]){
v[tx][ty] = 1;
dfs(tx,ty,dis + 1);
v[tx][ty] = 0;
if(flag)
return ;
}
}
}
int main()
{
int tx = x + next[i][0];
int ty = y + next[i][1];
if(tx < 0 || tx > n - 1 || ty < 0 || ty > m - 1 || map[tx][ty] == 'X')
continue;
if(!v[tx][ty]){
v[tx][ty] = 1;
dfs(tx,ty,dis + 1);
v[tx][ty] = 0;
if(flag)
return ;
}
}
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&t),n + m + t)
{
flag = 0;
memset(v,0,sizeof v);
int cnt = 0;
for(int i = 0; i < n; ++i)
scanf("%s",map[i]);
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
if(map[i][j] == 'S')
{
startx = i;
starty = j;
}
else if(map[i][j] == 'D')
{
endx = i;
endy = j;
}
if(Abs(startx - endx) + Abs(starty - endy) > t || (startx+starty+endx+endy + t) % 2 == 1)
{
printf("NO\n");
continue;
}
v[startx][starty] = 1;
dfs(startx,starty,0);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
while(~scanf("%d%d%d",&n,&m,&t),n + m + t)
{
flag = 0;
memset(v,0,sizeof v);
int cnt = 0;
for(int i = 0; i < n; ++i)
scanf("%s",map[i]);
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
if(map[i][j] == 'S')
{
startx = i;
starty = j;
}
else if(map[i][j] == 'D')
{
endx = i;
endy = j;
}
if(Abs(startx - endx) + Abs(starty - endy) > t || (startx+starty+endx+endy + t) % 2 == 1)
{
printf("NO\n");
continue;
}
v[startx][starty] = 1;
dfs(startx,starty,0);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
0 0
- hdu1010
- hdu1010
- HDU1010
- hdu1010
- hdu1010
- HDU1010
- hdu1010
- HDU1010
- HDU1010
- hdu1010
- hdu1010
- hdu1010
- hdu1010
- hdu1010
- hdu1010
- hdu1010
- hdu1010
- hdu1010
- Linux_开发板通过NFS挂载到虚拟机的几个错误解决
- 第二次上机实验-1
- Chromium网页渲染机制简要介绍和学习计划
- 机器视觉系列—— Vision 基础知识上集 http://bbs.elecfans.com/jishu_466819_1_1.html (出处: 中国电子技术论坛)
- 记录自己安装Android Studio
- hdu1010
- 从阿里到网易,一位非985/211本科应届生的一年求职路
- gdb命令使用
- seajs进阶
- 【IPC】互斥锁与条件变量及生产者-消费者问题
- Exynos4412 ADC 设备驱动开发
- C++实验2-标准体重
- Unity3D中基本GUI控件介绍
- KMS模拟器VLMCSD再次更新