您的位置:首页 > 其它

HDU 1010 Tempter of the Bone

2017-07-07 23:13 357 查看
题意:n x m的图,起始点'S',终点‘D',障碍‘X',可走的点'.',如果能在第t秒到达终点输出YES,否则输出NO,注意走过的点不能再走,1秒走1 步

解题思路:深搜dfs.这道题是在第t秒时到达,而不是在第t秒内到达,深搜的时候要注意剪枝,否则会超时。

奇偶剪枝:这类题从S到D的最短路的长度是abs(sx-ex)+abs(sy-ey),而且最后若能到达D,那么走过的距离一定与最短路的奇偶性一致。用if(abs(sx-ex)+abs(sy-ey)>t||(abs(sx-ex)+abs(sy-ey)-t)%2)进行剪枝,如果S到D的最短距离小于t或者最短距离与t的奇偶性不一致,就直接输出NO,不再往下进行了

代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
using namespace std;

int n,m,t;
char g[10][10];
int sx,sy,ex,ey,flag;
int dr[]={0,0,1,-1};
int dc[]={1,-1,0,0};
bool inside(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<m;
}
void dfs(int x,int y,int step)
{
if(x==ex&&y==ey&&step==t)
{
flag=1;
return ;
}
if(flag)return ;
for(int i=0;i<4;i++)
{
int nx=x+dr[i],ny=y+dc[i];
if(inside(nx,ny)&&(g[nx][ny]=='.'||g[nx][ny]=='D'))
{
g[nx][ny]='X';
dfs(nx,ny,step+1);
g[nx][ny]='.';
}
}
}
int main()
{
while(cin>>n>>m>>t&&n+m+t)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>g[i][j];
if(g[i][j]=='S')sx=i,sy=j;
if(g[i][j]=='D')ex=i,ey=j;
}
}
if(abs(sx-ex)+abs(sy-ey)>t||(abs(sx-ex)+abs(sy-ey)-t)%2)//奇偶剪枝
{
cout<<"NO"<<endl;
continue;
}
int step=0;
flag=0;
g[sx][sy]='X';
dfs(sx,sy,0);
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: