Rt.
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int gx[8]={-2,-2,-1,1,2,2,1,-1};
const int gy[8]={-1,1,2,2,1,-1,-2,-2};
int n,m,a[35][35];
int st,ed,v[905],cnt[905];
bool f[905],vis[905];
queue<int>q;
struct graph
{
int tot;
int hd[905];
int nxt[5005],to[5005];
void add(int u,int v)
{
tot++;
nxt[tot]=hd[u];
hd[u]=tot;
to[tot]=v;
return ;
}
}g;
void dfs(int u,int now)
{
vis[now]=true;
int x=now/m+1,y=now%m;
if(!y) x--,y=m;
for(int i=0;i<8;i++)
{
int xx=x+gx[i],yy=y+gy[i];
if(xx<1||xx>n||yy<1||yy>m) continue;
if(vis[m*(xx-1)+yy]) continue;
if(a[xx][yy]==2) continue;
if(a[xx][yy]==0)
{
g.add(u,now);
g.add(now,u);
}
dfs(u,m*(xx-1)+yy);
}
return ;
}
int main()
{
memset(v,0x3f,sizeof(v));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]==3) a[i][j]=0,st=m*(i-1)+j;
if(a[i][j]==4)
{
a[i][j]=0,ed=m*(i-1)+j;
//printf("ed:%d %d %d\n",ed,i,j);
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
memset(vis,0,sizeof(vis));
for(int k=0;k<8;k++)
if(!a[i][j])
{
int x=i+gx[k],y=j+gy[k];
if(!a[x][y])
{
g.add(m*(i-1)+j,m*(x-1)+y);
g.add(m*(x-1)+y,m*(i-1)+j);
}
if(x<1||x>n||y<1||y>m) continue;
dfs(m*(i-1)+j,m*(x-1)+y);
}
}
q.push(st);
v[st]=0;
cnt[st]=1;
f[st]=true;
while(!q.empty())
{
int x=q.front();
q.pop();
f[x]=false;
for(int i=g.hd[x];i;i=g.nxt[i])
if(v[x]+1<v[g.to[i]])
{
v[g.to[i]]=v[x]+1;
cnt[g.to[i]]=cnt[x];
if(!f[g.to[i]]) f[g.to[i]]=true,q.push(g.to[i]);
}
else if(v[x]+1==v[g.to[i]]) cnt[g.to[i]]+=cnt[x];
}
/*printf("\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
if(v[m*(i-1)+j]!=v[0]) printf("%d ",v[m*(i-1)+j]);
else printf("-1 ");
printf("\n");
}
printf("\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) printf("%d ",cnt[m*(i-1)+j]);
printf("\n");
}*/
if(v[ed]==v[0]) printf("-1");
else printf("%d\n%d",v[ed]-1,cnt[ed]);
return 0;
}
这份代码这个数据:
5 5
1 1 1 2 0
1 1 0 1 0
0 2 0 0 0
1 3 0 2 0
0 1 1 1 4
本地跑出来
1
4
(不知道为什么ed莫名其妙在SPFA时变2了,把v[g.to[i]]=v[x]+1;
注释掉就正常了)
但洛谷上跑出来
0
1
请问这是为什么?问题应该出在上面说的“(不知道为什么ed莫名其妙在SPFA时变2了,把v[g.to[i]]=v[x]+1;
注释掉就正常了)”
求大佬解答/kel