题目链接:

https://vjudge.net/contest/66965#problem/J

具体思路:

首先将每个点之间的最短距离求出(bfs),A 或者 S作为起点跑bfs,这样最短距离就求出来了。然后再用最短路的算法求出最小生成树的权值的和就可以了,getchar的注意事项在代码中解释。

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stdio.h>
using namespace std;
# define maxn 1000+10
# define inf 0x3f3f3f3f
# define ll long long
int n,m,num;
char a[maxn][maxn];
int vis[maxn][maxn];
int dis[maxn][maxn];
int f[2][4]= {{1,-1,0,0},{0,0,1,-1}};
int p[maxn];
int t[maxn][maxn];
int vis1[maxn*maxn];
struct node
{
int x,y,step;
node() {}
node(int xx,int yy,int zz)
{
x=xx;
y=yy;
step=zz;
}
};
bool judge(int t1,int t2)
{
if(t1>=0&&t1<n&&t2>=0&&t2<m)return true;
return false;
}
void bfs(int t1,int t2)
{
queue<node>q;
while(!q.empty())q.pop();
memset(vis,0,sizeof(vis));
vis[t1][t2]=1;
q.push(node(t1,t2,0));
while(!q.empty())
{
node temp=q.front();
q.pop();
if(t[temp.x][temp.y])
{
dis[t[t1][t2]][t[temp.x][temp.y]]=dis[t[temp.x][temp.y]][t[t1][t2]]=temp.step;
}
for(int i=0; i<4; i++)
{
int x=temp.x+f[0][i];
int y=temp.y+f[1][i];
if(judge(x,y)&&vis[x][y]==0&&a[x][y]!='#')
{
vis[x][y]=1;
q.push(node(x,y,temp.step+1));
}
}
}
}
int prim()
{
memset(vis1,0,sizeof(vis1));
int sum=0;
for(int i=1; i<=num; i++)
{
p[i]=dis[1][i];
}
vis1[1]=1;
for(int j=2; j<=num; j++)
{
int minn=inf,po;
for(int i=1; i<=num; i++)
{
if(!vis1[i]&&p[i]<minn)
{
minn=p[i];
po=i;
}
}
vis1[po]=1;
sum+=minn;
for(int i=1; i<=num; i++)
{
if(!vis1[i]&&dis[po][i]<p[i])
{
p[i]=dis[po][i];
}
}
}
return sum;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
num=0;
memset(t,0,sizeof(t));
scanf("%d %d",&m,&n);
gets(a[0]);//这里要先输入a[0]的原因是二维数组输入的时候会将回车也当成一个字符输入,所以二维数组的最后一行存储不上。
for(int i=0; i<n; i++)
{
gets(a[i]);
for(int j=0; j<m; j++)
{
if(a[i][j]=='S'||a[i][j]=='A')
{
num++;
t[i][j]=num;
}
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(t[i][j]==0)continue;
bfs(i,j);
}
}
int ans=prim();
// printf("%d\n",ans);
}
return 0;
}

J - Borg Maze +getchar 的使用注意(二维字符数组的输入)的更多相关文章

  1. 二维字符数组利用gets()函数输入

    举例: ][]; ;i<;i++) gets(a[i]); a是二维字符数组的数组名,相当于一维数组的指针, 所以a[i]就相当于指向第i个数组的指针,类型就相当于char *,相当于字符串.

  2. 【C/C++】二维数组的传参的方法/二维字符数组的声明,使用,输入,传参

    [问题] 定义了一个子函数,传参的内容是一个二维数组 编译提示错误 因为多维数组作为形参传入时,必须声明除第一位维外的确定值,否则系统无法编译(算不出偏移地址) [二维数组的传参] 方法一:形参为二维 ...

  3. 二维字符数组利用gets输入

    char a[10][81];for(int i=0;i<10;i++)gets(a[i]); a是二维数组的数组名,相当于一维数组的指针,所以a[i]就相当于指向第i个数组的指针,类型就相当于 ...

  4. Codeforces Round #369 (Div. 2) A. Bus to Udayland【字符串/二维字符数组求连起来的座位并改为其他字符】

    A. Bus to Udayland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  5. Codeforces Round #192 (Div. 2) A. Cakeminator【二维字符数组/吃掉cake,并且是一行或者一列下去,但是该行/列必须没有草莓的存在】

    A. Cakeminator time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  6. C二维字符数组的使用及如何获取二维数组的总行数和总列数!

    #include <stdio.h> #include <stdlib.h> int main(){ char str[][30] = {"zhangsan" ...

  7. sort对二维字符数组排序(转)

    由于二维字符数组的第二维没有赋值运算符,即不能对整个一维数组进行赋值,因此是无法直接对二维数组用sort进行排序的,解决办法有二种: 代码一: #include <iostream> #i ...

  8. J - Borg Maze

    J - Borg Maze 思路:bfs+最小生成树. #include<queue> #include<cstdio> #include<cstring> #in ...

  9. 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

    //在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’:输出这个数组中的所有元素. char [][]y=new char [10][10 ...

随机推荐

  1. redis压力测试工具-----redis-benchmark

    redis做压测可以用自带的redis-benchmark工具,使用简单 压测命令:redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000 压测需要一段 ...

  2. CF271D_Good Substrings

    给一个原串,以及那些字符是坏的,现在问你可以从原串中取出多少个不同子串,使得其所含的坏字符的个数不超过一个定数. 这个题目网上有各种各样的解法.如hash,tire. 我说一下我的解法. 解法一:后缀 ...

  3. Qt4问题集锦

    一.Qt程序发布后加载的jpg.jpeg图片不可见 问题的提出: 最近在客户机器上部署安装QT编写的软件,发现只要是jpg.jpeg格式的图片都无法显示出来.最后发现必须按如下述步骤才能显示jpg.j ...

  4. mybatis中@Param的使用

    @Param:当映射器方法需要多个参数时,这个注解可以被用于:给映射器方法中的每个参数来取一个名字.否则,多参数将会以它们的顺序位置和SQL语句中的表达式进行映射,这是默认的.    语法要求:若使用 ...

  5. C++模式学习------工厂模式

    工厂模式属于创建型模式,大致可以分为简单工厂模式.抽象工厂模式. 简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品. enum PTYPE { ProdA = , ProdB = ...

  6. VSS2005 上传pdf 空白

    加补丁 VS80-KB943847-X86-INTL.exe

  7. Codeforces 438D (今日gg模拟第二题) | 线段树 考察时间复杂度的计算 -_-|||

    Codeforces 438D The Child and Sequence 给出一个序列,进行如下三种操作: 区间求和 区间每个数模x 单点修改 如果没有第二个操作的话,就是一棵简单的线段树.那么如 ...

  8. 洛谷 P2184 贪婪大陆 解题报告

    P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小\(FF\)的\(Tower\) \(defence\)宣告失败--人类被蚂蚁们逼到了\(Greed\) \(Island\)上的一个海湾.现在 ...

  9. 2017实习【Java研发】面经

    标签: 实习 面经 Java研发 阿里.腾讯.华为 找2017暑假实习,经历过被腾讯拒绝的无奈,也有拿到阿里和华为offer的喜悦,找实习过程也有一段时间了,在此把之前的面试知识点和经历做个小总结,以 ...

  10. springcloud之config 配置管理中心之配置属性加密解密

    1.为什么要加密解密? 为了维护项目的安全性. 2.配置加密解密的前提是什么? 要进行JCE下载,然后替换掉jdk的security文件: 下载链接:http://www.oracle.com/tec ...