题目链接:

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

具体思路:

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

  1. #include<iostream>
  2. #include<string>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<vector>
  7. #include<queue>
  8. #include<stdio.h>
  9. using namespace std;
  10. # define maxn 1000+10
  11. # define inf 0x3f3f3f3f
  12. # define ll long long
  13. int n,m,num;
  14. char a[maxn][maxn];
  15. int vis[maxn][maxn];
  16. int dis[maxn][maxn];
  17. int f[2][4]= {{1,-1,0,0},{0,0,1,-1}};
  18. int p[maxn];
  19. int t[maxn][maxn];
  20. int vis1[maxn*maxn];
  21. struct node
  22. {
  23. int x,y,step;
  24. node() {}
  25. node(int xx,int yy,int zz)
  26. {
  27. x=xx;
  28. y=yy;
  29. step=zz;
  30. }
  31. };
  32. bool judge(int t1,int t2)
  33. {
  34. if(t1>=0&&t1<n&&t2>=0&&t2<m)return true;
  35. return false;
  36. }
  37. void bfs(int t1,int t2)
  38. {
  39. queue<node>q;
  40. while(!q.empty())q.pop();
  41. memset(vis,0,sizeof(vis));
  42. vis[t1][t2]=1;
  43. q.push(node(t1,t2,0));
  44. while(!q.empty())
  45. {
  46. node temp=q.front();
  47. q.pop();
  48. if(t[temp.x][temp.y])
  49. {
  50. dis[t[t1][t2]][t[temp.x][temp.y]]=dis[t[temp.x][temp.y]][t[t1][t2]]=temp.step;
  51. }
  52. for(int i=0; i<4; i++)
  53. {
  54. int x=temp.x+f[0][i];
  55. int y=temp.y+f[1][i];
  56. if(judge(x,y)&&vis[x][y]==0&&a[x][y]!='#')
  57. {
  58. vis[x][y]=1;
  59. q.push(node(x,y,temp.step+1));
  60. }
  61. }
  62. }
  63. }
  64. int prim()
  65. {
  66. memset(vis1,0,sizeof(vis1));
  67. int sum=0;
  68. for(int i=1; i<=num; i++)
  69. {
  70. p[i]=dis[1][i];
  71. }
  72. vis1[1]=1;
  73. for(int j=2; j<=num; j++)
  74. {
  75. int minn=inf,po;
  76. for(int i=1; i<=num; i++)
  77. {
  78. if(!vis1[i]&&p[i]<minn)
  79. {
  80. minn=p[i];
  81. po=i;
  82. }
  83. }
  84. vis1[po]=1;
  85. sum+=minn;
  86. for(int i=1; i<=num; i++)
  87. {
  88. if(!vis1[i]&&dis[po][i]<p[i])
  89. {
  90. p[i]=dis[po][i];
  91. }
  92. }
  93. }
  94. return sum;
  95. }
  96. int main()
  97. {
  98. int T;
  99. scanf("%d",&T);
  100. while(T--)
  101. {
  102. num=0;
  103. memset(t,0,sizeof(t));
  104. scanf("%d %d",&m,&n);
  105. gets(a[0]);//这里要先输入a[0]的原因是二维数组输入的时候会将回车也当成一个字符输入,所以二维数组的最后一行存储不上。
  106. for(int i=0; i<n; i++)
  107. {
  108. gets(a[i]);
  109. for(int j=0; j<m; j++)
  110. {
  111. if(a[i][j]=='S'||a[i][j]=='A')
  112. {
  113. num++;
  114. t[i][j]=num;
  115. }
  116. }
  117. }
  118. for(int i=0; i<n; i++)
  119. {
  120. for(int j=0; j<m; j++)
  121. {
  122. if(t[i][j]==0)continue;
  123. bfs(i,j);
  124. }
  125. }
  126. int ans=prim();
  127. // printf("%d\n",ans);
  128. }
  129. return 0;
  130. }

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. poj 1966(顶点连通度)

    题意:给出一个n个节点和m条边的图,求该图的顶点连通度. 分析: 顶点连通度的求解可以转换为网络最大流问题. (1)原图G中的每个顶点v变成网络中的两个顶点v‘和v’‘,顶点v’至v''有一个条弧(有 ...

  2. Java并发知识点总结

    前言:Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.同时,如果想要提升自己的技术,Java并发知识必不可少,这里简单整理了一些相关内容,希望可以起到抛砖引玉的作用 ...

  3. UVAlive4080_Warfare And Logistics

    给一个无向图,求出两个值,所有点到所有其他点的最短距离和,任意删除一条边后的这个值. 数据规模是100点1000边. 白书例题,不多说了直接对于每个点求出最短路树,对于每条边,如果它不是最短路树上的边 ...

  4. STM32标准外设库、 HAL库、LL库

    工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是常用的库,后面的LL库是ST最近才添加,目前支持的 ...

  5. selenium基础-打开百度进行搜索

    1. 安装Python 2. 安装selenium 3. 下载谷歌驱动ChromeDriver,放到Python的Scripts目录下 4. 编写代码,如下 # coding: utf-8 from ...

  6. BZOJ 2844: albus就是要第一个出场

    2844: albus就是要第一个出场 Time Limit: 6 Sec  Memory Limit: 128 MBSubmit: 1134  Solved: 481[Submit][Status] ...

  7. bzoj1026windy数

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1026 Description windy定义了一种windy数.不含前导零且相邻两个数字之 ...

  8. Merge Intervals - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Merge Intervals - LeetCode 注意点 区间是无序的 每个区间start一定小于end 解法 解法一:首先以start的值从小到大来 ...

  9. 洛谷 P3797 妖梦斩木棒 解题报告

    P3797 妖梦斩木棒 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的\(n\)段.现在这个木棒可以看做 ...

  10. 响应式开发(四)-----Bootstrap CSS----------Bootstrap CSS概览和相关注意事项

    本章先记录一些与Bootstrap CSS相关的一些特点和注意事项以及兼容性. HTML 5 文档类型(Doctype) Bootstrap 使用了一些 HTML5 元素和 CSS 属性.为了让这些正 ...