8

来源:互联网 发布:想学编程从哪里开始 编辑:程序博客网 时间:2024/04/25 19:36
#include<iostream>#include<string.h>#include<stdio.h>#include<algorithm>#include<cmath>#include<queue>#define MAX 210using namespace std;char map[MAX][MAX];bool visit[MAX][MAX];int dir[2][4]={{0,0,1,-1},{1,-1,0,0}};int step[MAX][MAX];int m,n,s,t;struct node{    int x,y;    bool ok()    {        if(0<=x&&x<m&&0<=y&&y<n)          return true;        return false;    }};int spfa(){    int i,j;    node u,v;    u.x=0;    u.y=0;    memset(step,-1,sizeof(step));    memset(visit,0,sizeof(visit));    queue<node>q;    q.push(u);    visit[0][0]=true;    step[0][0]=0;    while(!q.empty())    {        u=q.front();        q.pop();        visit[u.x][u.y]=0;        for(i=0;i<4;i++)        {            v.x=u.x+dir[0][i];            v.y=u.y+dir[1][i];            if(v.ok())            {                if(step[v.x][v.y]>step[u.x][u.y]+(map[v.x][v.y]=='#'?4:1)||step[v.x][v.y]==-1)                {                    step[v.x][v.y]=step[u.x][u.y]+(map[v.x][v.y]=='#'?4:1);                    if(!visit[v.x][v.y])                    {                        q.push(v);                        visit[v.x][v.y]=1;                    }                }            }        }    }    return step[s-1][t-1];}int main(){    int i,j;    while(~scanf("%d%d",&m,&n))    {        for(i=0;i<m;i++)          scanf("%s",map[i]);        scanf("%d%d",&s,&t);        printf("%d\n",spfa());    }}