题意
2255是一个傻X,他连自己家灯不亮了都不知道。
某天TZ大神路过他家,发现了这一情况,
于是TZ开始行侠仗义了。
TZ发现是电路板的问题,
他打开了电路板,发现线路根本没有连上!!
于是他强大的脑力可以使某个格子上的线路从\变为/,
或者从/变为\。
2255不会电路(因为他什么都不会),但是他想知道TZ最少要用多少次脑力才能使他家的灯变亮。
如果无法变亮,输出“NO SOLUTION”。
n,m<=500
分析
直接建图跑最短路。。。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=260005;
const int inf=0x3f3f3f3f;
int n,m,dis[N],last[N],cnt;
char ch[N];
struct edge{int to,next,w;}e[N*8];
bool vis[N];
queue<int> que;
int point(int x,int y)
{
return (x-1)*(m+1)+y;
}
void addedge(int u,int v,int w)
{
e[++cnt].to=v;e[cnt].w=w;e[cnt].next=last[u];last[u]=cnt;
e[++cnt].to=u;e[cnt].w=w;e[cnt].next=last[v];last[v]=cnt;
}
void spfa()
{
for (int i=1;i<=(n+1)*(m+1);i++) dis[i]=inf;
dis[1]=0;que.push(1);vis[1]=1;
while (!que.empty())
{
int u=que.front();que.pop();
for (int i=last[u];i;i=e[i].next)
if (dis[u]+e[i].w<dis[e[i].to])
{
dis[e[i].to]=dis[u]+e[i].w;
if (!vis[e[i].to]) que.push(e[i].to),vis[e[i].to]=1;
}
vis[u]=0;
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
scanf("%s",ch+1);
for (int j=1;j<=m;j++)
if (ch[j]=='/')
{
addedge(point(i,j+1),point(i+1,j),0);
addedge(point(i,j),point(i+1,j+1),1);
}
else
{
addedge(point(i,j),point(i+1,j+1),0);
addedge(point(i,j+1),point(i+1,j),1);
}
}
spfa();
if (dis[(n+1)*(m+1)]<inf) printf("%d",dis[(n+1)*(m+1)]);
else puts("NO SOLUTION");
return 0;
}