【ybt】【基算 广搜 课过 例5】电路维修

电路维修

题目链接:电路维修


题目描述

在这里插入图片描述
在这里插入图片描述

解题思路

这道题的难点无非在于改变格子后如何保存状态。

但其实根本没必要。

直接跑 s p f a spfa spfa 就可以了。

只是判断路径麻烦了一点。

卡常难了一点而已。

code

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

char pg[5]={' ','/','\\','\\','/'};
const int xg[5]={0,0,0,1,1};
const int yg[5]={0,0,1,0,1};
const int xn[5]={0,-1,-1,1,1};
const int yn[5]={0,-1,1,-1,1};

int T,n,m;
int ans;
char a[510][510];
int minn[510][510];

struct abc{
	int x,y,s;
}f[2500000];

void bfs()
{
	int hd=0,tl=1;
	memset(minn,0x3f3f3f3f,sizeof(minn));
	minn[0][0]=0;
	f[1].x=f[1].y=f[1].s=0;
	while(hd!=tl)
	{
		hd=(hd+1)%1000000;
		if(f[hd].s>=ans)
			continue;
		if(f[hd].x==n&&f[hd].y==m)
		{
			if(ans>f[hd].s)
				ans=f[hd].s;
			continue;
		}
		for(int i=1;i<=4;++i)
		{
			int x=f[hd].x+xn[i];
			int y=f[hd].y+yn[i];
			int xx=f[hd].x+xg[i];
			int yy=f[hd].y+yg[i];
			if(x<0||x>n||y<0||y>m)
				continue;
			if(minn[x][y]>f[hd].s+(a[xx][yy]==pg[i]))
			{
				tl=(tl+1)%1000000;
				f[tl]=(abc){x,y,f[hd].s+(a[xx][yy]==pg[i])};
				minn[x][y]=f[tl].s;
			}
		}
	}
}

int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;++i)
			for(int j=1;j<=m;++j)
			{
				a[i][j]=getchar();
				while(a[i][j]!='\\'&&a[i][j]!='/')
					a[i][j]=getchar();
			}
		ans=0x3f3f3f3f;
		bfs();
		if(ans!=0x3f3f3f3f)
			printf("%d\n",ans);
		else
			printf("NO SOLUTION\n");
	}
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值