题目链接: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;
}