| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
为何多了一步到终点就退出,就会错误/* Note:Your choice is C IDE */
#include "stdio.h"
int n,m,p,q;
int min[305][305];//记忆化DP:保存每一点的最小值
int zou[4][2]={ {0,1},{0,-1},{1,0},{-1,0} };
int turn[305][305];//记忆化保存每一点的耗时值
//算法:直接遍历耗时表,取最小值
typedef struct
{
int i,j;
}Q;
Q queue[90010];//注意队列的大少
int bfs(int x,int y)
{
int x2,y2,z;
int front,tail;
front=tail=0;
queue[0].i=x;
queue[0].j=y;
tail=1;
min[x][y]=turn[x][y];//初始化起始点
while(front!=tail)
{
x=queue[front].i;
y=queue[front].j;
front++;
if(front==90010) front=0;//循环队列
for(z=0;z<4;z++)
{
x2=x+zou[z][0];
y2=y+zou[z][1];
if( x2>=0 && x2<m && y2>=0 && y2<n )
{
//到达终点,就退出,这一步有问题
/*if( x2==p && y2==q )
{
min[p][q]=turn[x2][y2]+min[x][y];
return 0;
}*/
//判断原地的值加上走后的值的大小情况
if( turn[x2][y2]+min[x][y] < min[x2][y2] )
{
min[x2][y2]=turn[x2][y2]+min[x][y];//修改最小值
queue[tail].i=x2;
queue[tail].j=y2;
tail++;
if(tail==90010) tail=0;//循环队列
}
}
}
}
return 0;
}
int main()
{
int i,j,a,b;
char str[305];
//freopen("2312.txt","r",stdin);
while(1)
{
scanf("%d%d",&m,&n);
if( n==0 && m==0 ) break;
for(i=0;i<m;i++)
{
scanf("%s",str);
for(j=0;j<n;j++)
{
turn[i][j]=10000;
min[i][j]=10000;
switch(str[j])
{
case 'Y':a=i;b=j;turn[i][j]=1;break;//一开始就要1
case 'T':p=i;q=j;turn[i][j]=0;break;//终点的耗时为0
case 'S': ;
case 'R':break;
case 'E':turn[i][j]=1;break;
case 'B':turn[i][j]=2;break;//打墙壁耗时2
}
}
//printf("%s\n",str);
}
bfs(a,b);//广度优先搜索
if(min[p][q]==10000) printf("-1\n");
else printf("%d\n",min[p][q]);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator