当前位置: 首页 > article >正文

c++瓷砖

今天的题目叫“瓷砖”,是“DFS深度优先搜索 递归”一类的。

题目描述

在一个w×h的矩形广场上,每一块1 x 1的地面都铺设了红色或黑色的瓷砖。小谢同学站在某一块黑色的瓷砖上,他可以从此处出发,移动到上、下、左、右四个相邻的且是黑色的瓷砖上。
现在他想知道,通过重复上述移动所能经过的黑色瓷砖数。

输入

第一行为两个数h和w,2≤w,h≤50,之间有一个空格隔开。
以下为一个w行h列的二维字符矩阵,每个字符为“.”  “#”  “@" ,分别表示该位置为黑色的瓷砖、红色的瓷砖,以及小Y的初始位置。

输出

输出一行一个整数,表示小Y从初始位置出发可以到达的瓷砖数。

输入样例
20 26
#...#....##..###....
##.#.......#.#.....#
.#..###...###.#...#.
#.@#....###..#.#...#
.#.....###...#...##.
#..#.#......##.....#
.##.#.#.....#.......
#.#....##.#.###.#...
#.....###.#.#...##..
.##...##...#.......#
#........#..#.....##
#..#....####...#..#.
##.####...#.#...##.#
....#.##..##.###.#..
.#........#...#.#...
..#.....#.....#...#.
.....###.#.....#.#.#
##..#..##....#...###
..#.......#.........
.##....#........#..#
..###...#...#.......
#.#....#..#...#.....
..#.....#..##....##.
.####.####..#....#.#
.#.##.#...#.#.#.#...
#...#..#.....#...#..
输出样例
250

其实这问题就是求最大联通块。

解题:

方法1(深搜,dfs):

#include<cstdio>
#include<iostream>
using namespace std;
char a[60][60];
bool flag[60][60];
int ans=1;
void dfs(int x,int y)
{
    if(a[x+1][y]=='.' && !flag[x+1][y])
    {
        flag[x+1][y]=1;
        ans++;
        dfs(x+1,y);
    }
    if(a[x-1][y]=='.' && !flag[x-1][y])
    {
        flag[x-1][y]=1;
        ans++;
        dfs(x-1,y);
    }
    if(a[x][y+1]=='.' && !flag[x][y+1])
    {
        flag[x][y+1]=1;
        ans++;
        dfs(x,y+1);
    }
    if(a[x][y-1]=='.' && !flag[x][y-1])
    {
        flag[x][y-1]=1;
        ans++;
        dfs(x,y-1);
    }
    return;
}
int main()
{
    int w,h;
    cin>>h>>w;
    int x,y;
    for(int i=1;i<=w;i++)
    {
        for(int j=1;j<=h;j++)
        {
            cin>>a[i][j];
            if(a[i][j]=='@')
            {
                x=i;
                y=j;
            }
        }
    }
    dfs(x,y);
    cout<<ans<<endl;
    return 0;
}

方法2(宽搜,bfs):

#include<bits/stdc++.h>
using namespace std;
int n,m,sx,sy,ans;
int a[60][60];
struct node{
	int x,y;
};
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};//方向 
queue<node>q;
int bfs(node s){
	q.push(s);
	a[s.x][s.y]='#';
	ans++;
	while(!q.empty()){
		node u=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			int xx=dx[i]+u.x;
			int yy=dy[i]+u.y;
			if(xx>0&&yy>0&&xx<=n&&yy<=m&&a[xx][yy]=='.'){
				
				ans++;
				q.push({xx,yy});
				a[xx][yy]='#';//标记 
			}
		}
	}
	
	
}
int main(){
	cin>>m>>n;
	char c;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>c;
			a[i][j]=c;
			if(c=='@'){
				sx=i;sy=j;//初始位置
			}
		}
	}
	bfs({sx,sy});
	cout<<ans<<endl;
 
 
    return 0;
}


http://www.kler.cn/a/516098.html

相关文章:

  • 4. LwIP_网络数据包管理
  • Spring AI Document
  • 消息队列篇--原理篇--常见消息队列总结(RabbitMQ,Kafka,ActiveMQ,RocketMQ,Pulsar)
  • IoTDB结合Mybatis使用示例(增删查改自定义sql等)
  • electron打包报错解决
  • ThinkPHP 8模型与数据的插入、更新、删除
  • 转换模型到 bfloat16 精度之前需要做的检查工作,不然模型报错给你看
  • Java学习教程,从入门到精通,JDBC创建数据库语法知识点及案例代码(99)
  • SpringBoot读取配置优先级顺序是什么?
  • 【记录自开发的SQL工具】工具字符拼接、Excel转sql、生成编码、生成测试数据
  • verilog笔记1
  • jmeter中对接口进行循环请求后获取相应数据
  • 智能工厂数字化化集成落地项目(交付版 67页)PPT 解读
  • K8S 快速实战
  • 【ARTS】【LeetCode-704】二分查找算法
  • 洛谷刷题1-3
  • Java如何实现反转义
  • 【Ubuntu】安装SSH启用远程连接
  • UE 像素流Pixel Streaming笔记
  • 五种高频设计模式及其在 Spring 中的应用揭秘