题目链接:信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

题目描述:

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入:

包括多组数据。每组数据的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下:

1)‘.’:黑色的瓷砖;

2)‘#’:白色的瓷砖;

3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每组数据中唯一出现一次。

当在一行中读入的是两个零时,表示输入结束。

这道题在一本通的分类为搜索与回溯算法,但在这里,我们要引出另一种方法——黏菌法。

想必大部分人是对这个路线规划大师黏菌有所耳闻的,黏菌的基本机理就是走所有的路,然后去掉没用的,到无路需走时结束,而我们的想法就是让初始瓷砖“@”作为黏菌的母菌,不断探索,如果一个黑瓷砖四周有“@”则会被扩散成“@”,不断扩散,因为每次可扩散时至少扩散一个且能扩散到所有能到达的地方,故使用while循环,令每次循环增加“@”数为delta,当delta=0时扩散结束,统计“@”数量即可。

代码如下↓

#include<bits/stdc++.h>
using namespace std;
int m,n,delta=-1,s=0,t=0,f=0;//delta=-1保证while的进行
int a[25][25];
char q;
int main()
{while(cin>>m>>n&&m!=0&&n!=0){s=0;t=0;delta=-1;for(int i=1;i<=24;i++)for(int j=1;j<=24;j++)a[i][j]=0;//硬核初始化数组。 for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>q;if(q=='.') a[i][j]=1;if(q=='#') a[i][j]=2;if(q=='@') a[i][j]=3;}//转换格式,方便后续while(delta!=0){t=s;s=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(a[i][j]==1&&((a[i-1][j]==3)||(a[i][j-1]==3)||(a[i][j+1]==3)||(a[i+1][j]==3))) a[i][j]=3;//扩散的判断(注意是判断这个格子会不会被扩散)if(a[i][j]==3) s++;}  delta=s-t;}s=0;//重新统计数量for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i][j]==3) s++;cout<<s<<endl;  }return 0;
}

同样的,比如1215迷宫也可判断出口会不会被入口扩散到,1219马走日可将扩散规则加以改变,8皇后则可以将皇后设为母菌并改变扩散规则,可以认为几乎所有搜索题都能转为图形并运用

————作者吐槽时间————

纯粹是深搜学不会了。

经典问题的另类解法——以信息学奥赛一本通c++版1216红与黑为例相关推荐

  1. 信息学奥赛一本通C++语言-----2036:【例5.3】开关门

    [题目描述] 宾馆里有n(2≤n≤1000)n(2≤n≤1000) 个房间,从1∼n1∼n 编了号.第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是22 的倍数的房间"相反处理& ...

  2. 信息学奥赛一本通C++语言-----2048:【例5.18】串排序

    [题目描述] 对给定的n(1≤n≤20)n(1≤n≤20)个国家名(国家名字长度不超过2020),按其字母的顺序输出. [输入] 第一行为国家的个数nn: 以下nn行为国家的名字. [输出] nn行, ...

  3. 信息学奥赛一本通c++版在线评测系统_OPPO Reno3 Pro评测:迄今为止最“性感”的5G手机...

    一.前言和图赏 今年我们看到了一个不一样的OPPO,畅销多年的R系列停更,由Reno接棒开启OPPO手机的下个十年. 可能是刚开启的新产品线,用户接受度还不高,Reno目前还没有表现出R系列的辉煌,但 ...

  4. 信息学奥赛一本通c++版在线评测系统_Redmi K30S至尊纪念版评测:2299元还有谁

    一.前言和图赏 自去年Redmi推出K30之后,这个系列开始频繁推出新机型,迄今为止至少有5款机型在售,比产品线更新的还要快. 这是为何?一切都要从卢伟冰接手Redmi说起,扛起了小米性价比大旗,而小 ...

  5. 信息学奥赛一本通(C++版) 第二部分 基础算法 第九章 动态规划

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 第二部分 基础算法 第九章 动态规划 第一节 动 ...

  6. 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02

    /* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...

  7. 信息学奥赛一本通 1358:中缀表达式值(expr)

    [题目链接] ybt 1358:中缀表达式值(expr) [题目考点] 1. 表达式求值 中缀表达式转后缀表达式 后缀表达式求值 [解题思路] 由于题目要求做中缀表达式转为后缀表达式,而后求值.那么这 ...

  8. 信息学奥赛一本通 1356:计算(calc)

    [题目链接] ybt 1356:计算(calc) [题目考点] 1. 表达式求值 中缀表达式求值 2. 表达式树 表达式树:一棵表达式树可以表示一系列的运算. 表达式树中的结点包括运算符与数值 str ...

  9. 信息学奥赛一本通 2021:【例4.6】最大公约数

    [题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...

最新文章

  1. HttpRequestException encountered解决方法
  2. 如何使div填充剩余的水平空间?
  3. 汇编解析(4)-BIOS
  4. bat文件名操作_Excel按文件名制作目录,你复制粘贴花一小时,同事只要十秒搞定...
  5. yarn oom问题一例
  6. 集成服务入门(实验7)数据流的目标
  7. FFmpeg总结(四)AV系列结构体之AVBuffer、AVBufferRef、AVBufferPool
  8. NHibernate Mapping文件中如何指定类的字节数组属性
  9. 链表-双向循环链表【C语言】
  10. MOSEK优化包的安装、使用及注册:以Matlab中的二次规划为例
  11. 在字节实习8个月后,成功转正
  12. 阿里云centos7.4安装并部署svn1.10.0版本(配置多仓库,加入开机自启动)
  13. CVTE面试总结(全网面经,已收offer)
  14. m4a转换成mp3如何操作?
  15. std::future、std::promise、std::packaged_task、std::async
  16. java代理模式学习笔记
  17. CCNP 15 交换机3
  18. 4、使用bean的scop属性来配置bean的作用域
  19. 把多个txt文件合成一个txt文件
  20. 下载一个应用程序,华硕手机秒变3D扫描仪

热门文章

  1. 通过MERL100计算Blender Disney BRDF参数
  2. mysql group by个数_mysql 统计 group by 之后的 group 的个数
  3. 互联网思维——社会化思维
  4. 随机的Lazy-Greedy:lazier than lazy greedy
  5. GBase 8s 基本语法
  6. 为什么文件删除了但磁盘空间没有释放?
  7. 十道必问的软件测试面试题(含答案解析)
  8. 回发或回调参数无效 的解决办法
  9. java程序员学技术都会访问那些网站?
  10. 2、Lctech Pi(F1C200S)开发环境搭建(CherryPi,Mangopi,F1C100S)