求助UB(大概)
  • 板块学术版
  • 楼主Mine_KingCattleya
  • 当前回复1
  • 已保存回复1
  • 发布时间2020/7/14 21:19
  • 上次更新2023/11/6 23:07:23
查看原帖
求助UB(大概)
195331
Mine_KingCattleya楼主2020/7/14 21:19

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

2020/7/14 21:19
加载中...