CSP-S 例题15-1 搜索迷宫

描述

在迷宫中,人们可以往北部,西部,东部和南部移动脚步。一个人从起点出发,希望迷宫里所有的人都能联系起来,并且联系的成本最低。注意:不需要两两联系,通过别人联系即可。
第一行包含两个整数 x,y 的行开始,使得 1≤x,y≤50。然后,跟随 y 行,每行 x 个字符。对于每个角色,空格“ ”代表开放空间,标记“#”代表障碍墙,大写字母 “A” 代表人,大写字母 “S” 代表搜索的开始。迷宫的周长总是关闭的,也就是说,没有办法从 “S” 的坐标中走出来。迷宫中至多有 100 个人,每个人都可以到达。
输出:输出一行包含成功搜索迷宫的最小成本。

输入描述

详情见描述

输出描述

详情见描述

样例输入 1 

7 7
#####
#AAA###
#    A#
# S ###
#     #
#AAA###
#####

样例输出 1 

11
#include <bits/stdc++.h>
using namespace std;
const int inf=2501;
char mp[51][51];
int node[51][51];
int col,row;
int num;
int dist[101][101];
int edge[101][101];
int nexts[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
void bfs(int i,int j)
{
    bool vis[51][51];
    memset(vis,false,sizeof(vis));
    memset(dist,0,sizeof(dist));
    int qx[2510],qy[2510],head=0,tail=0;
    vis[i][j]=1;
    qx[tail]=i;
    qy[tail]=j;
    tail++;
    while(head<tail)
    {
        int x=qx[head];
        int y=qy[head];
        head++;
        if(node[x][y])
        {
            edge[node[i][j]][node[x][y]]=dist[x][y];
        }
        for(int k=0; k<4; k++)
        {
            int mx=x+nexts[k][0];
            int my=y+nexts[k][1];
            if(mx>=1 and mx<=row and my>=1 and my<=col)
            {
                if(vis[mx][my]==0 and mp[mx][my]!='#')
                {
                    qx[tail]=mx;
                    qy[tail]=my;
                    tail++;
                    vis[mx][my]=1;
                    dist[mx][my]=dist[x][y]+1;
                }
            }
        }
    }
}
int prim()
{
    int s=1;
    bool book[110]= {};
    int dis[110],ans=0;
    memset(dis,0x3f,sizeof(dis));
    dis[1]=0;
    for(int i=1; i<=num; i++)
    {
        int u,minn=0x3f;
        for(int j=1; j<=num; j++)
        {
            if(book[j]==0 and dis[j]<minn)
            {
                u=j;
                minn=dis[j];
            }
        }
        book[u]=1;
        ans+=minn;
        for(int j=1; j<=num; j++)
        {
            if(book[j]==0 and dis[j]>edge[u][j])
            {
                dis[j]=edge[u][j];
            }
        }
    }
    return ans;
}
int main()
{

    cin>>row>>col;
    char temp[51];
    cin.getline(temp,51);
    for(int i=1; i<=row; i++)
    {
        cin.getline(mp[i],51);
    }
    for(int i=1; i<=row; i++)
    {
        for(int j=1; j<=col; j++)
        {
            if(mp[i][j]=='A'||mp[i][j]=='S')
            {
                node[i][j]=++num;
            }
        }
    }
    for(int i=1; i<=row; i++)
    {
        for(int j=1; j<=col; j++)
        {
            if(node[i][j])
            {
                bfs(i,j);
            }
        }
    }
    cout<<prim();
    return 0;
}

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值