【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");
	}
}

猜你喜欢

转载自blog.csdn.net/SSL_guyixin/article/details/112918014