hdu 2425

用vis数组标记到达当前位置的最小时间,如果比最小时间大则不加入队列

 

 

 

 

 

 

#include<stdio.h>
#include<queue>
#include<string.h>
#define inf 0x3fffffff
using namespace std;
char map[30][30];
int n,m,sx,sy,ex,ey;
int cost[4],vis[30][30];
int dir[4][2]={0,1,1,0,0,-1,-1,0};
struct op
{
    int x,y,w;
};
int judge(int x,int y)
{
    if(x<0||x>=n||y<0||y>=m||map[x][y]=='@')
        return 0;
    return 1;
}
void bfs()
{
	queue<op>Q;
	op cur,next;
	vis[sx][sy]=0;//忘记初始化起点的值,找了好久才找出来 
    cur.w=0;cur.x=sx;cur.y=sy;       
    Q.push(cur);
    while(!Q.empty())
    {
        cur=Q.front();
        Q.pop();
        for(int i=0;i<4;i++)
        {
            next.x=cur.x+dir[i][0];
            next.y=cur.y+dir[i][1];
            if(judge(next.x,next.y))
            {
                if(map[next.x][next.y]=='#')
                    next.w=cur.w+cost[0];
                else if(map[next.x][next.y]=='.')
                    next.w=cur.w+cost[1];
                else if(map[next.x][next.y]=='T')
                    next.w=cur.w+cost[2];
                if(next.w<vis[next.x][next.y])
                {Q.push(next);vis[next.x][next.y]=next.w;}
                
            }
            
        }
    }
}
int main()
{
    int i,j,k,op=1;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
                vis[i][j]=inf;
			for(i=0;i<3;i++)
				scanf("%d",&cost[i]);
			for(i=0;i<n;i++)
				scanf("%s",map[i]);
			scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
			bfs();
			if(vis[ex][ey]<inf)
				k=vis[ex][ey];
			else     k=-1;
			printf("Case %d: ",op++);
			printf("%d\n",k);
    }
    return 0;
}


 

你可能感兴趣的:(c,算法,Google,百度,ACM)