您的位置:首页 > 编程语言

hdu oj 1010 老是超时 先放到这里 参考别人ac代码

2014-04-15 20:41 363 查看
#include <stdio.h>
#include <math.h>
int dir[][2] = {1,0,-1,0,0,1,0,-1};
bool vis[10][10];
char maze[10][10];
int n,m,t_time,end_x,end_y;
int myabs(int x)
{
return x>=0?x:-x;
}
bool DFS(int pos_x,int pos_y,int t)
{
int absx = abs(end_x-pos_x);
int absy = abs(end_y-pos_y);

if(maze[pos_x][pos_y]=='D'&&t==t_time)
{
return true;
}

//所用的时间超过所需最大时间
if(t>=t_time)
{
return false;
}

//设下的时间比理论最少到达时间要少那么必定到不了
if(t_time-t<(absx+absy))
{
return false;
}

//剩余时间比理论最少时间多出的不是偶数必然到不了
if((t_time-t-absx-absy)%2!=0)
{
return false;
}

int i,next_x,next_y;

for(i=0;i<4;i++)
{
next_x = pos_x+dir[i][0];

next_y = pos_y+dir[i][1];

if(next_x>=0&&next_x<n&&next_y>=0&&next_y<m&&!vis[next_x][next_y]&&maze[next_x][next_y]!='X')
{
vis[next_x][next_y] = true;

if(!DFS(next_x,next_y,t+1))
{
vis[next_x][next_y] = false;
}
else
{
return true;
}

}
}

return false;
}
int main()
{
int i,j,star_x,star_y;

bool flag;

while(scanf("%d %d %d",&n,&m,&t_time)==3)
{
if(n==0&&m==0&&t_time==0)
break;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
vis[i][j] = false;
for(i=0;i<n;i++)
{
scanf("%s",maze[i]);
}

for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
if(maze[i][j]=='S')
{
star_x = i;
star_y = j;
}

if(maze[i][j]=='X')
{
end_x = i;
end_y = j;
}
}
}
vis[star_x][star_y] = true;

flag = DFS(star_x,star_y,0);

//flag  = BFS(star_x,star_y,0);
if(!flag)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: