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;
}

posted @   纯粹的  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示