奶牛选美(dfs+bfs)

奶牛选美(dfs+bfs)奶牛选美听说最近两斑点的奶牛最受欢迎 约翰立即购进了一批两斑点牛 不幸的是 时尚潮流往往变化很快 当前最受欢迎的牛变成了一斑点牛 约翰希望通过给每头奶牛涂色 使得它们身上的两个斑点能够合为一个斑点 让它们能够更加时尚 牛皮可用一个 N M 的字符矩阵来表示 如下所示 XXXX XXX XXXX XX XXXX XXX XXXXX XXX 其中 X 表示斑点部分 如果两个 X 在垂直或水平方向上相邻 对角相邻不算在内 则它们属于同一个斑点 由此看出上图中恰好有两个斑点

奶牛选美

听说最近两斑点的奶牛最受欢迎,约翰立即购进了一批两斑点牛。

不幸的是,时尚潮流往往变化很快,当前最受欢迎的牛变成了一斑点牛。

约翰希望通过给每头奶牛涂色,使得它们身上的两个斑点能够合为一个斑点,让它们能够更加时尚。

牛皮可用一个 N×M 的字符矩阵来表示,如下所示:

如果两个 X 在垂直或水平方向上相邻(对角相邻不算在内),则它们属于同一个斑点,由此看出上图中恰好有两个斑点。

约翰牛群里所有的牛都有两个斑点。

约翰希望通过使用油漆给奶牛尽可能少的区域内涂色,将两个斑点合为一个。

在上面的例子中,他只需要给三个 . 区域内涂色即可(新涂色区域用 ∗ 表示):

输入格式
第一行包含两个整数 N 和 M。

接下来 N 行,每行包含一个长度为 M 的由 X 和 . 构成的字符串,用来表示描述牛皮图案的字符矩阵。

输出格式
输出需要涂色区域的最少数量。

数据范围
1≤N,M≤50
输入样例:
6 16

…XXXX…XXX…
…XXXX…XX…
.XXXX…XXX…
…XXXXX…
…XXX…
输出样例:
3






















#include 
     #include 
     using namespace std; int dir[4][2]={ 
   1,0,0,1,-1,0,0,-1}; //四个方向 int n,m; char a[60][60]; struct node { 
    int X,Y,TIME; }; queue<node> q; void dfs(int xx,int yy) { 
    int i,j,tx,ty; node t; t.TIME=0; t.X=xx;t.Y=yy; a[xx][yy]='!'; q.push(t); for(i=0;i<4;i++) { 
    tx=xx+dir[i][0]; ty=yy+dir[i][1]; if(tx<0||tx>=n||ty<0||ty>=m||a[tx][ty]!='X') continue; dfs(tx,ty); } } int bfs() { 
    int tx,ty,i; node nextt,now; while(!q.empty()) { 
    now=q.front(); q.pop(); nextt.TIME=now.TIME+1; for(i=0;i<4;i++) { 
    tx=now.X+dir[i][0]; ty=now.Y+dir[i][1]; if(tx<0||tx>=n||ty<0||ty>=m||a[tx][ty]=='!') continue; if(a[tx][ty]=='X') return now.TIME; a[tx][ty]='!'; nextt.X=tx;nextt.Y=ty; q.push(nextt); } } } int main() { 
    int i,j,x,y,flag=1,ans; cin>>n>>m; for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<n&&flag;i++) //找到一个‘X’ { 
    for(j=0;j<m&&flag;j++) { 
    if(a[i][j]=='X') { 
    flag=0; x=i;y=j; } } } dfs(x,y); //将该斑点的所有‘X’放进队列q ans=bfs(); cout<<ans<<endl; return 0; } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209653.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午8:44
下一篇 2026年3月19日 上午8:44


相关推荐

  • IDEA优化导包配置[通俗易懂]

    IDEA优化导包配置[通俗易懂]

    2022年5月21日
    42
  • ubuntu18.04配置静态ip和动态ip[通俗易懂]

    ubuntu18.04配置静态ip和动态ip[通俗易懂]今天需要使用ubuntu系统作项目了,发现问题来了:所使用的主机(ubuntu18.04)之前是配置好的静态ip,现在实验室响应学校信息中心的号召,使用单人账号登陆了,每个人独享自己的20M带宽,网速溜得一匹。现在问题来了,如何恢复成动态ip呢?自己算是取巧了吧,查看的是如何配置静态ip,照着里面原始的ip配置,恢复了动态ip。1.ubuntu18.04配置静态ip注意:18.04…

    2022年5月2日
    144
  • 使用 Python 程序实现摩斯密码翻译器|Python 主题月

    使用 Python 程序实现摩斯密码翻译器|Python 主题月摩斯密码是一种将文本信息作为一系列通断的音调 灯光或咔嗒声传输的方法 无需特殊设备 熟记的小伙伴即可直接翻译 它以电报发明者 SamuelF B Morse 的名字命名 算法算法非常简单 英语中的每个字符都被一系列 点 和 破折号 代替 或者有时只是单数的 点 或 破折号 反之亦然 加密在加密的情况下 我们一次一个地从单词中提取每个字符 如果不是空格 并将其与存储在我们选择的任何数据结构中的相应摩斯密码匹配 如果您使用 python 编码 字典可以变成在这种情况下非常有用 将摩斯密码存储在

    2026年1月31日
    2
  • 显示器屏幕的刷新率hz和帧数fps有什么区别?「建议收藏」

    显示器屏幕的刷新率hz和帧数fps有什么区别?「建议收藏」关于游戏帧数FPS值和屏幕刷新率,相信是电竞玩家比较关心的话题了。如果我们需要了解刷新率和帧数的区别,那么我们就需要知道它们原本是什么意思!下面装机之家科普一下.帧数FPS一般就是我们所说一秒钟内画面刷新的速度,60fps就是一秒钟出现60张画面,而对帧数起到决定性的是电脑中的显卡,显卡性能越强,帧数当然就越高啦,然后画面就越流畅。刷新率一般都是出现在显示器/屏幕上,比如我的是高刷新率显示器,14…

    2022年5月28日
    143
  • webgoat安装

    webgoat安装安装由于 WebGoat8 使用 jdk1 8 编译所以我们也需要安装 jdk1 8 先下载 webgoat server 8 0 jar 下载完成后将其放在 安装目录 即可启动安装完成之后在 cmd 中输入 cdwebgoat 安装目录 java jarwebgoat server 8 0 jar 登录启动完成后 使用浏览器访问 http 127 0 0 1 8080 WebG

    2026年3月19日
    2
  • JavaScript模块化

    JavaScript模块化文章目录 JavaScript 模块化 ES6 的模块化 export 命令与 import 命令 as 关键字重命名 impot 命令 JavaScript 模块化模块化的优势 1 防止命名冲突 2 代码复用 3 高维护性 CommonJS 服务于服务器 gt NodeJS BrowserifyES 模块化服务于服务器和浏览器 ES6 的模块化依赖模块需要编译打包处理 比如 ES6 gt ES5ES6 模块化的设计思想使尽量静态化 使得编译时就能确定模块的依赖关系 以及输入输出的变量 模块功能主要由两个命令

    2026年3月20日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号