原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010
分析:题意即为再规定的时间内从开始点走在结束点。要学会奇偶减枝,在这里是所在位置到结束位置的最段时间与剩余时间的奇偶性一定一样。
我的代码:
#include<stdio.h>
char map[8][8];
int s_x,s_y,e_x,e_y;
int x[]={0, 1, 0,-1}; //右,下,左,上的顺序。
int y[]={1, 0,-1,0};
int n,m;
bool flag=false;
int LL(int a) //取绝对值。
{
return a>=0? a:-a;
}
void Solve(int s_x,int s_y,int time)//time为剩余时间。
{
if(flag) return;
if(time==0&&s_x==e_x&&s_y==e_y) //看最后是否有满足题意的解。
{
flag=true;
return;
}
if((LL(e_x-s_x)+LL(e_y-s_y))%2!=time%2) return ; //奇偶剪枝。
for(int i=0;i<4;i++)
{
int next_x=s_x+x[i];
int next_y=s_y+y[i];
if(next_x<n&&next_x>=0&&next_y>=0&&next_y<m&&map[next_x][next_y]!='X')
{
map[s_x][s_y]='X'; //在进入下一位置时,把原来的位置变成墙,即'X'。
Solve(next_x,next_y,time-1);
map[s_x][s_y]='.'; //回溯时变回原来的'.'。
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
int time;
while(scanf("%d%d%d",&n,&m,&time)==3&&(n+m+time))
{
getchar(); //这是第一个吸收回车,数字与字符之间的回车。
int i,j;
for(i=0;i<n;i++)
{
//getchar(); // 一开始的时间想用这一个来吸收回车,各种错,最后发现是最后一行的回车没有吸收,但觉得那个回车没必要吸呀。
for(j=0;j<m;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='S')
{
s_x=i;
s_y=j;
}
else if(map[i][j]=='D')
{
e_x=i;
e_y=j;
}
}
getchar(); //这是第二个吸收回车,字符与字符之间的回车。
}
flag=false;
Solve(s_x,s_y,time);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
总结:不停的WA,很超时。主要是吸收回车,和减枝。第一次写减枝写成了
LL(e_x-s_x+e_y-s_y);
哎。。这题目交了26次..o(︶︿︶)o