今日小结(12.30)

这篇博客介绍了如何利用深度优先搜索(DFS)算法解决两种经典问题:数字矩阵的闭合圈填充和迷宫路径计数。在矩阵填充问题中,DFS遍历闭合圈内的所有0,将其替换为2。在迷宫问题中,DFS用于计算从起点到终点的不同路径数量,避开障碍。代码示例展示了具体的实现细节,适用于解决二维网格问题。
摘要由CSDN通过智能技术生成

 填涂颜色

题目描述

由数字 00 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 11 构成,围圈时只走上下左右 44 个方向。现要求把闭合圈内的所有空间都填写成 22。例如:6\times 66×6 的方阵(n=6n=6),涂色前和涂色后的方阵如下:

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

输入格式

每组测试数据第一行一个整数 n(1 \le n \le 30)n(1≤n≤30)。

接下来 nn 行,由 00 和 11 组成的 n \times nn×n 的方阵。

方阵内只有一个闭合圈,圈内至少有一个 00。

//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)

输出格式

已经填好数字 22 的完整方阵。

输入输出样例

输入 #1复制

6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1

输出 #1复制

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

说明/提示

对于 100\%100% 的数据,1 \le n \le 301≤n≤30。

做题思路:这题运用的是dfs就可以做出来。首先将矩阵输出在1-n的空间上,因为未被包围的0可能并不互相联通,故可以从0-n+1的空间使用深搜,就可全部搜索到不变的0并标记,输出时将未标记到的0输出成2即可

具体代码:

#include<stdio.h>
int a[35][35]={0},b[35][35]={0};
    int n;
    int dx[4]={0,0,-1,1};
    int dy[4]={-1,1,0,0};

   void bfs(int x,int y){
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            int nx=x+dx[i];
            int ny=y+dy[i];
            if(nx>=0&&nx<=n+1&&ny>=0&&ny<=n+1&&b[nx][ny]==0&&a[nx][ny]==0){
                b[nx][ny]=1;
               bfs(nx,ny);
            }

        }
    }}
 int main()
{

    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        scanf("%d",&a[i][j]);
int x=0,y=0;
        bfs(x,y);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(a[i][j]==0&&b[i][j]==1)printf("0 ");
               else if(a[i][j]==1)printf("1 ");
                else printf("2 ");
            }printf("\n");
        }



}

迷宫

题目描述

给定一个 N \times MN×M 方格的迷宫,迷宫里有 TT 处障碍,障碍处不可通过。

在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。

输入格式

第一行为三个正整数 N,M,TN,M,T,分别表示迷宫的长宽和障碍总数。

第二行为四个正整数 SX,SY,FX,FYSX,SY,FX,FY,SX,SYSX,SY 代表起点坐标,FX,FYFX,FY 代表终点坐标。

接下来 TT 行,每行两个正整数,表示障碍点的坐标。

输出格式

输出从起点坐标到终点坐标的方案总数。

输入输出样例

输入 #1复制

2 2 1
1 1 2 2
1 2

输出 #1复制

1

说明/提示

对于 100\%100% 的数据,1 \le N,M \le 51≤N,M≤5,1 \le T \le 101≤T≤10,1 \le SX,FX \le n1≤SX,FX≤n,1 \le SY,FY \le m1≤SY,FY≤m。

做题思路:一道很普通的深搜题,建立一个数组,用来标记走过的路径,注意在要使用dfs前先将起点标记,每次对下一步所走位置判断是否终点,成功就返回,并将前一步的标记去除继续搜索,每次找到终点次数加一,这样结果就出来了

代码如下:

#include<stdio.h>
int N,M,T;
int c,f;
int SX,SY,FX,FY,x,y;
int ans=0;
int b[10][10]={0};
int dx[4]={0,0,-1,1},dy[4]={-1,1,0,0};
void bfs(int x,int y)
{
    if(x==FX&&y==FY){ans++;return ;}
    for(int i=0;i<4;i++){

            int nx=x+dx[i];
            int ny=y+dy[i];

            if(b[nx][ny]==1){
                b[nx][ny]=0;
            bfs(nx,ny);
                b[nx][ny]=1;
            }
    }
}
int main()
{

    scanf("%d %d %d",&N,&M,&T);
    scanf("%d %d %d %d",&SX,&SY,&FX,&FY);


    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){
            b[i][j]=1;
        }
    }for(int i=0;i<T;i++){
        scanf("%d %d",&c,&f);
        b[c][f]=0;}
    x=SX;y=SY;
    b[x][y]=0;
    bfs(x,y);
    printf("%d",ans);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值