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()); }}