P2937 [USACO09JAN] Laserphones S
题解
深搜和广搜的结合,一次性往四个方向打标记
code
#include<bits/stdc++.h>
using namespace std;
string s[105];
int vis[105][105]={0};
int main()
{
int n,m;
cin>>m>>n;
int flag=0,x1,y1;
for(int i=1;i<=n;i++)
{
cin>>s[i];
s[i]=' '+s[i];
for(int j=1;j<=m;j++)
{
if(s[i][j]=='C'&&!flag)
{
flag=1;
x1=i;
y1=j;
}
}
}
vis[x1][y1]=1;
queue<pair<int,int> > q;
q.push(make_pair(x1,y1));
while(q.size())
{
int x=q.front().first,y=q.front().second;
q.pop();
if(s[x][y]=='C'&&(x!=x1||y!=y1))
{
cout<<vis[x][y]-2;
break;
}
for(int i=x+1;i<=n&&s[i][y]!='*';i++)
{
if(!vis[i][y])
{
vis[i][y]=vis[x][y]+1;
q.push(make_pair(i,y));
}
}
for(int i=x-1;i>=1&&s[i][y]!='*';i--)
{
if(!vis[i][y])
{
vis[i][y]=vis[x][y]+1;
q.push(make_pair(i,y));
}
}
for(int i=y+1;i<=m&&s[x][i]!='*';i++)
{
if(!vis[x][i])
{
vis[x][i]=vis[x][y]+1;
q.push(make_pair(x,i));
}
}
for(int i=y-1;i>=1&&s[x][i]!='*';i--)
{
if(!vis[x][i])
{
vis[x][i]=vis[x][y]+1;
q.push(make_pair(x,i));
}
}
}
return 0;
}

浙公网安备 33010602011771号