电路维修
题目链接:电路维修
题目描述
解题思路
这道题的难点无非在于改变格子后如何保存状态。
但其实根本没必要。
直接跑 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");
}
}