学习总结1

算法

这两天对搜索(主要是dfs)进行了复习,写了四道题目.

解题思路

这道题我用dfs进行解题,这道题比起其他的只多了一个Z轴也就是多了两个方向.

代码

#include <string.h>
#include <stdio.h>
char g[31][31][31];
int ne[7][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
int j[31][31][31];
struct dui
{
    int x;
    int y;
    int z;
}d[31*31*31];
int l,r;
int x,y,z;
int bfs()
{
    int tx,ty,tz,k;
    while(l<r)
    {
        for(k=0;k<6;k++)
        {
            tz=ne[k][0]+d[l].z;
            tx=ne[k][1]+d[l].x;
            ty=ne[k][2]+d[l].y;
            if(tz>z||tz<0||tx>x||tx<0||ty>y||ty<0)
                continue;
            if(g[tz][tx][ty]=='E')
            {
                return j[d[l].z][d[l].x][d[l].y]+1;
            }
            if(j[tz][tx][ty]==0&&g[tz][tx][ty]=='.')
            {
                j[tz][tx][ty]=j[d[l].z][d[l].x][d[l].y]+1;
                d[r].z=tz;
                d[r].x=tx;
                d[r++].y=ty;
            }
        }
        l++;
    }
    return 0;
}
int main()
{
    int a,b,c;
    while(1)
    {
        scanf("%d%d%d",&z,&x,&y);
        if(x==0&&y==0&&z==0)
            break;
        l=0;
        r=0;
        memset(j,0,sizeof(int)*31*31*31);
        for(c=0;c<z;c++)
        {
            for(a=0;a<x;a++)
            {
                scanf("%s",g[c][a]);
            }
        }
        for(c=0;c<z;c++)
        {
            for(a=0;a<x;a++)
            {
                for(b=0;b<y;b++)
                {
                    if(g[c][a][b]=='S')
                    {
                        j[c][a][b]=1;
                        d[r].z=c;
                        d[r].x=a;
                        d[r++].y=b;
                        int k=bfs();
                        if(k!=0)
                        {
                            printf("Escaped in %d minute(s).\n",k-1);
                        }
                        else
                        {
                            printf("Trapped!\n");
                        }
                    }
                }
            }
        }
    }
    return 0;
}

 

解题思路

这道题遍历即可解决,但如果使用纯暴力会超时计算量太大,所以要用二进制遍历.

因为每翻一次周围的也会跟着翻一次,而且如果某一个瓷砖翻两次就相当于没有进行翻动,所以我们可以对第一行进行一个假设.假设第一行每个瓷砖的翻面次数,对第一行进行翻面后如果第一行还有黑色存在那必然是这个瓷砖下面的瓷砖进行了翻面.如果到最后一行进行翻面后还有黑色瓷砖则代表第一行翻面次数不对.

PS:这道题目因为可能有多个答案所以还要考虑比较翻面次数,只取翻面次数最小的.

代码

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
using namespace std;
int g[20][20];
int j[20][20];
int gg[20][20];
int jj[20][20];
int ne[6][2]={{1,0},{-1,0},{0,1},{0,-1},{0,0}};
int h[20];
int n,m;
int k;
int dfs(int i)
{
    for(int y=0;y<n;y++)
    {
        if(j[i][y]==1)
        {
            for(int x=0;x<5;x++)
            {
                int tx=i+ne[x][0];
                int ty=y+ne[x][1];
                if(tx<0||tx>=m||ty<0||ty>=n)
                    continue;
                if(gg[tx][ty]==0)
                {
                    gg[tx][ty]=1;
                }
                else
                {
                    gg[tx][ty]=0;
                }
            }
        }
    }
    if(i+1==m)
    {
        for(int y=0;y<n;y++)
        {
            if(gg[i][y]==1)
                return 0;
        }
        return 1;
    }
    for(int y=0;y<n;y++)
    {
        if(gg[i][y]==1)
        {
            j[i+1][y]=1;
        }
    }
    return dfs(i+1);
}
void cls()
{
    for(int x=0;x<m;x++)
    {
        for(int y=0;y<n;y++)
        {
            gg[x][y]=g[x][y];
        }
    }
    memset(j,0,sizeof(int )*20*20);
}
int main()
{
    int x,y,mi=999999;
    scanf("%d%d",&m,&n);
    for(x=0;x<m;x++)
    {
        for(y=0;y<n;y++)
        {
            scanf("%d",&g[x][y]);
        }
    }

    for(x=0;x<1<<n;x++)
    {
        k=0;
        cls();
        for(y=0;y<n;y++)
        {
            j[0][y]=h[y];
        }
        k=dfs(0);
        if(k!=0)
        {
            k=0;
            for(int l=0;l<m;l++)
            {
                for(int r=0;r<n;r++)
                {
                    if(j[l][r]==1)
                        k++;
                }
            }
            if(k<mi)
            {
                mi=k;
                for(int l=0;l<m;l++)
                {
                    for(int r=0;r<n;r++)
                    {
                        jj[l][r]=j[l][r];
                    }
                }
            }
        }
        int d=n-1;
        h[d]+=1;
        while(h[d]==2)
        {
            h[d]=0;
            d--;
            h[d]++;
        }
    }
    if(mi==999999)
    {
        printf("IMPOSSIBLE");
    }
    else
    {
        for(x=0;x<m;x++)
        {
            for(y=0;y<n;y++)
            {
                printf("%d ",jj[x][y]);
            }
            printf("\n");
        }
    }
    return 0;
}

解题思路

简单的dfs就可以解决,我们只要每遇到石油就将与它相邻的石油打上标记就好.

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
using namespace std;
char g[110][110];
int ne[9][2]={{1,0},{-1,0},{0,1},{0,-1},{-1,-1},{1,-1},{-1,1},{1,1}};
int n,m;
int dfs(int x,int y)
{
    int tx,ty,z;
    for(z=0;z<8;z++)
    {
        tx=ne[z][0]+x;
        ty=ne[z][1]+y;
        if(tx<0||tx>m||ty<0||ty>n)
            continue;
        if(g[tx][ty]=='@')
        {
            g[tx][ty]='*';
            dfs(tx,ty);
        }
    }
    return 0;
}
int main()
{
    int sum=0;
    while(1)
    {
        sum=0;
        scanf("%d%d",&m,&n);
        //getchar();
        if(n==0&&m==0)
            break;
        for(int x=0;x<m;x++)
        {
            scanf("%s",g[x]);
            //getchar();
        }
        for(int x=0;x<m;x++)
        {
            for(int y=0;y<n;y++)
            {
                if(g[x][y]=='@')
                {
                    g[x][y]='*';
                    dfs(x,y);
                    sum++;
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

java

我初步了解了java的基本语法,基本的数据类型和数组的定义与运用.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/274570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React状态管理库快速上手-Redux(一)

基本使用 安装 pnpm install reduxjs/toolkit react-redux创建一个仓库 定义state createSlice相当于创建了一个模块仓库&#xff0c;initialState存放状态&#xff0c;reducers存放改变状态的方法。 import { createSlice } from reduxjs/toolkitexport const counterSli…

2024.3.19

思维导图 模拟面试 1.友元的作用 答&#xff1a;通过关键字friend&#xff0c;可以让一些函数或者类&#xff0c;可以访问一个类中的私有数据成员。 2.匿名对象的作用 答&#xff1a;匿名对象就是没有名字的对象&#xff0c;是用来给有名对象进行初始化工作的。 3.常成员函…

使用Vscode连接云进行前端开发

使用Vscode连接云进行前端开发 1、ssh连接腾讯云 本人使用的是腾讯云。 然后vscode,用最新版&#xff0c;插件选择remote ssh&#xff0c;或者remote xxx下载过来。 然后点击远程资源管理器&#xff0c;选择SSH通道 然后输入命令如下。 ssh rootip然后输入密码 腾讯云应该…

Java使用itextpdf往pdf中插入图片

引入maven依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.9</version> </dependency>java代码 import cn.hutool.extra.qrcode.QrCodeUtil; import com.itextpdf.text.*; i…

nodejs 使用express插件multer文件上传,接收不到文件的bug

把路径改成绝对路径即可 改成 temp是你想上传到文件夹的路径&#xff0c;一般是在项目根目录下

未来汽车EE架构趋势

多种趋势推动着电动汽车&#xff08;EV&#xff09;、混合动力电动汽车&#xff08;HEV&#xff09;和插电式混合动力电动汽车&#xff08;PHEV&#xff09;的发展。城市化和可持续发展的压力促使各国政府出台支持性法规&#xff0c;使制造商从中受益&#xff0c;而税收优惠政策…

C#,图论与图算法,计算无向连通图中长度为n环的算法与源代码

1 无向连通图中长度为n环 给定一个无向连通图和一个数n,计算图中长度为n的环的总数。长度为n的循环仅表示该循环包含n个顶点和n条边。我们必须统计存在的所有这样的环。 为了解决这个问题,可以有效地使用DFS(深度优先搜索)。使用DFS,我们可以找到特定源(或起点)的长度…

湖北省地质灾害分布数据 崩塌滑坡泥石流空间分布地质灾害详查等数据集

地质灾害是指在自然或者人为因素的作用下形成的&#xff0c;对人类生命财产造成的损失、对环境造成破坏的地质作用或地质现象。地质灾害在时间和空间上的分布变化规律&#xff0c;既受制于自然环境&#xff0c;又与人类活动有关&#xff0c;往往是人类与自然界相互作用的结果。…

Spark-Scala语言实战(3)

在之前的文章中&#xff0c;我们学习了如何在来如何在IDEA离线和在线安装Scala&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实…

Linux:Gitlab:16.9.2 创建用户及项目仓库基础操作(2)

我在上一章介绍了基本的搭建以及邮箱配置 Linux&#xff1a;Gitlab:16.9.2 (rpm包) 部署及基础操作&#xff08;1&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136821311?spm1001.2014.3001.5501 本章介绍一下用户的创建&#xff0c;组内设置用户&…

xAI开发的一款巨大型语言模型(HLM)--Grok 1

在xAI发布Grok的权重和架构之后&#xff0c;很明显大型语言模型&#xff08;LLM&#xff09;的时代已经过去&#xff0c;现在是巨大型语言模型&#xff08;HLM&#xff09;的时代。这个混合专家模型发布了3140亿个参数&#xff0c;并且在Apache 2.0许可下发布。这个模型没有针对…

力扣--回溯算法51.N皇后

思路分析&#xff1a; isValue函数用于判断当前位置是否可以放置皇后&#xff0c;通过检查当前列、左上方斜线和右上方斜线是否有皇后来确定。dfs函数采用深度优先搜索的方式&#xff0c;在每一行尝试放置皇后&#xff0c;如果当前位置合法&#xff0c;则递归继续尝试下一行&a…

Stable Diffusion WebUI 生成参数:高清修复/高分辨率修复(Hires.fix)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 在本篇文章中&#xff0c;我们将深入探讨 Stable Diffusion WebUI 的一个引人注目的生成参数——高分辨率修复&#xff08;Hires.fix&#xff09;。我们将逐一…

web前端之不一样的下拉菜单、不选中第一个元素的样式效果、伪类排除第一个元素、符号选择器、hover、not、first、child

MENU 效果图htmlcssJShtmlcss 效果图 htmlcssJS html <nav><ul><li class"navli"><h4>HTML5</h4><ul class"ulson"><li class"lison">HTML5</li></ul></li><li class"na…

微信小程序项目实战遇到的问题

我们以学生成绩平台来作为例子。这是我们想得到的效果。 以下是完整代码&#xff1a; index.js // index.js Page({//页面的初始数据data: {hello: 欢迎进入微信小程序的编程世界,score: 80,userArray: [{name: 张三,score: [66, 77, 86, 70, 90]},{name: 李四,score: [88, 7…

使用ES检索PDF等文档的全栈方案之前端demo(end)

写在前面 通过之前的系列文章&#xff0c;整个ES搜索文件的流程与大的问题已经统统扫除了&#xff0c;既然是全栈流程&#xff0c;是不能缺少前端查询页面的&#xff0c;前端需简单实现一个用户输入查询关键词句&#xff0c;发起搜索&#xff0c;页面以表格形式展示查询的结果…

【2024.3.19练习】统计子矩阵

题目描述 题目分析 这道题一开始没有思路&#xff0c;使用蛮力枚举的方法时间复杂度为&#xff0c;显然超时。 参考题解后学会了化二维问题为一维问题&#xff0c;先使用的复杂度限制子矩阵的高度&#xff0c;再考虑列&#xff0c;这样就将子矩阵的和问题转变为了连续子序列的…

机器人离散化阻抗控制

机器人离散化阻抗控制是一种控制策略&#xff0c;它结合了阻抗控制的思想与离散化方法&#xff0c;以实现对机器人运动与外力之间动态关系的精细调节。这种控制方法旨在使机器人在与环境交互时能够表现出期望的阻抗特性&#xff0c;从而实现对接触力和位置的精确控制。 在离散…

【源码&教程】基于GAN的动漫头像生成系统

1.研究背景 我们都喜欢动漫角色&#xff0c;并试图创造我们的定制角色。然而&#xff0c;要掌握绘画技巧需要巨大的努力&#xff0c;之后我们首先有能力设计自己的角色。为了弥补这一差距&#xff0c;动画角色的自动生成提供了一个机会&#xff0c;在没有专业技能的情况下引入定…

Word为图表设置图注并在图表清单中自动生成

1如果需要自动插入题注&#xff0c;请不要自己为文件增加新的标题样式或删除自带的标题1样式 2章节大标题最好是标题1&#xff0c;2,3而不要设置标题一、二、三&#xff0c;否则图例在自动生成时会显示 图一 -1&#xff0c;调整起来会非常不方便 若实在要使用大写中文标题&…
最新文章