本文所引用程序段:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,a[1000][1000][3],t[2][2],v[1000][1000];
int dp(int,int,int);
int main()
{
freopen("home.in","r",stdin);
freopen("home.out","w",stdout);
int mi=0,pa=0;
memset(a,0,sizeof(a));
memset(v,0,sizeof(v));
cin>>n>>m;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j][0];
if(a[i][j][0]==2)
{
t[0][0]=i;
t[0][1]=j;
}
if(a[i][j][0]==3)
{
t[1][0]=i;
t[1][1]=j;
}
}
}
dp(t[0][0],t[0][1],2);
dp(t[1][0],t[1][1],3);
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j][0]==4&&pa==0&&a[i][j][1]+a[i][j][2]!=0)
{
mi=a[i][j][1]+a[i][j][2];
pa=1;
}
if(a[i][j][0]==4&&a[i][j][1]+a[i][j][2]!=0) mi=min(a[i][j][1]+a[i][j][2],mi);
}
}
cout<<mi;
return 0;
}
int dp(int x,int y,int z)
{
if(a[x][y][0]==4) return 0;
v[x][y]=1;
for(int i=x-1;i<=x+1;i++)
{
if(i<0||i>=m) continue;
for(int j=y-1;j<=y+1;j++)
{
if(j<0||j>=n) continue;
if(i!=x&&j!=y) continue;
if(v[i][j]==1) continue;
if(a[i][j][0]!=1)
{
if(a[i][j][z-1]==0) a[i][j][z-1]=a[x][y][z-1]+1;
else a[i][j][z-1]=min(a[x][y][z-1]+1,a[i][j][z-1]);
dp(i,j,z);
}
}
}
v[x][y]=0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,a[1000][1000][3],t[2][2],v[1000][1000];
int dp(int,int,int);
int main()
{
freopen("home.in","r",stdin);
freopen("home.out","w",stdout);
int mi=0,pa=0;
memset(a,0,sizeof(a));
memset(v,0,sizeof(v));
cin>>n>>m;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j][0];
if(a[i][j][0]==2)
{
t[0][0]=i;
t[0][1]=j;
}
if(a[i][j][0]==3)
{
t[1][0]=i;
t[1][1]=j;
}
}
}
dp(t[0][0],t[0][1],2);
dp(t[1][0],t[1][1],3);
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j][0]==4&&pa==0&&a[i][j][1]+a[i][j][2]!=0)
{
mi=a[i][j][1]+a[i][j][2];
pa=1;
}
if(a[i][j][0]==4&&a[i][j][1]+a[i][j][2]!=0) mi=min(a[i][j][1]+a[i][j][2],mi);
}
}
cout<<mi;
return 0;
}
int dp(int x,int y,int z)
{
if(a[x][y][0]==4) return 0;
v[x][y]=1;
for(int i=x-1;i<=x+1;i++)
{
if(i<0||i>=m) continue;
for(int j=y-1;j<=y+1;j++)
{
if(j<0||j>=n) continue;
if(i!=x&&j!=y) continue;
if(v[i][j]==1) continue;
if(a[i][j][0]!=1)
{
if(a[i][j][z-1]==0) a[i][j][z-1]=a[x][y][z-1]+1;
else a[i][j][z-1]=min(a[x][y][z-1]+1,a[i][j][z-1]);
dp(i,j,z);
}
}
}
v[x][y]=0;
}