题目:http://blog.csdn.net/qq_35786326/article/details/78820271
题意:
寻求最短路径,但可越出平板(暂时性)。
分析:
相对其他的题目来说比较难,但只要处理好一些细节后,便会从复杂到简单。我绝对不会说出ta是最小转弯的 升级版!
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#define LL long long
using namespace std;
inline LL read(){
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
int t[10001],n,m,head,tail,state[10001][2],x[76][76],y[76][76],i,j,dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
void bfs()
{
int zt,a,b,c,d,i,j,ij,x1,y1;
while(b=read(),a=read(),d=read(),c=read(),a!=0&&b!=0&&c!=0&&d!=0)//输入一次,处理一次
{
for(i=0;i<=n+1;i++) for(j=0;j<=m+1;j++) y[i][j]=0;//y数组初始化
x[a][b]=0;x[c][d]=0;//将起点和终点解封(0为可以走,1为不可走)
head=0;tail=1;t[1]=0;state[1][0]=a;state[1][1]=b;y[a][b]=1;//套路,不说了,不懂去其他广搜里找
do
{
head++;
for(i=0;i<4;i++)
{
x1=state[head][0]+dx[i];y1=state[head][1]+dy[i];//坐标
while(x[x1][y1]==0&&x1>=0&&x1<=n+1&&y1>=0&&y1<=m+1)//一直走到黑(?)
{
if(y[x1][y1]==0)
{
y[x1][y1]=1;
tail++;
state[tail][0]=x1;state[tail][1]=y1;t[tail]=t[head]+1;//老规矩
if(x1==c&&y1==d)
{
printf("%d\n",t[tail]);//t[tail]为所求
tail=0;
break;
}
}
x1+=dx[i];y1+=dy[i];
}
if(tail==0) break;
}
}
while(head<tail);
if(tail!=0) printf("0\n");//因为可能输出0,所以一定要有这句!不然直接WA
x[a][b]=1;x[c][d]=1;//重新封路(好习惯)
}
return;
}
int main()
{
m=read();n=read();char s;
int i,j;
for(i=1;i<=n;i++)
{
j=0;
while(s=getchar(),s!='\n')
{
j++;
if(s=='X') x[i][j]=1;
else x[i][j]=0;
}
}
bfs();
return 0;
}