广搜(练习4题)

几道例题还比较简单,练习就卡了比较长的时间了(。_。)

所以我会写一下解题思路了(๑ŐдŐ)
还有博客抽风所以代码里会有一些奇奇怪怪的东西,无视就好了qwq。

这几道题我就按各人认为的难易程度来排序吧QAQ。

第一题.

题意:输入一个迷宫,输出起点到终点的最短路径。


输入:

10
0100110100
0001110010
1000000001
1000100011
0000101100
1000001100
1001010011
0000010100
0101010000
1001000001
1 7 10 2

输出:

14


解题思路:就是走迷宫233。之前做过的了(⊙o⊙)。

(详见:http://blog.csdn.net/mr_wuyongcong/article/details/78732439 广搜例题


代码:

#include<cstdio>
using namespace std;
int n,head,tail,state[1000001][3],x,y,s,py,px;
bool walk[1001][1001];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};//移动方式
char c;
void bfs()
{state[1][2]=0;head=0;tail=1;do{head++;//出队for (int i=0;i<4;i++){x=state[head][0]+dx[i];//位置y=state[head][1]+dy[i];//位置if (walk[x][y] && x>0 && y>0 && x<=n && y<=n)//是否可以通行{tail++;//入队state[tail][2]=state[head][2]+1;state[tail][0]=x;state[tail][1]=y;walk[x][y]=false;//封闭路线if (x==px && y==py)//判断终点{s=state[tail][2];return;}}}}while(head<tail);//判断结束
}
int main()
{scanf("%d\n",&n);for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){c=getchar();if (c=='0') walk[i][j]=true;}c=getchar();}	scanf("%d%d%d%d",&state[1][0],&state[1][1],&px,&py);  //输入不解释bfs();//广搜不解释printf("%d",s);//输出不解释//就是那么任性QAQ
}


第二题:细胞问题(水题)

题目大意:一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。


输入:

4 10
0234500067
1034560500
2045600671
0000000089
输出:

4


解题思路:这道题刚开始做了半天从一个开始搜。后来突然顿悟,为什么不能从多个位置开始搜>(@_@)<。于是就轻轻松松的搞定了233。


代码:

#include<cstdio>
using namespace std;
int n,m,s,head,tail,state[2401][2];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};//细胞拓展方向
int a[61][61];
char c;
void bfs(int x,int y)
{head=0;tail=1;state[1][0]=x;state[1][1]=y;do{head++;//出队for (int i=0;i<4;i++){x=state[head][0]+dx[i];y=state[head][1]+dy[i];if(a[x][y] && x>0 && x<=m && y>0 && y<=n)//如果这里是细胞则往这边拓展{tail++;//入队a[x][y]=false;//封闭该位置细胞state[tail][0]=x;state[tail][1]=y;}}}while (head<tail);
}
int main()
{scanf("%d%d\n",&m,&n);		for (int i=1;i<=m;i++){for (int j=1;j<=n;j++){c=getchar();if (c!='0') a[i][j]=true;}c=getchar();}//输入不解释  for (int i=1;i<=m;i++)for (int j=1;j<=n;j++)//将所有的细胞枚举一遍{if(a[i][j])//当该处有细胞时数量可以加了{bfs(i,j);//封闭该位置链接的细胞s++;//数量加1}}printf("%d",s);//输出
}

第三题:最小转弯路径(难度开始加大了)

题意:给出一个地图,求起点到终点要转的最少弯数。


输入:

5 7
1 0 0 0 0 1 0
0 0 1 0 1 0 0  
0 0 0 0 1 0 1  
0 1 1 0 0 0 0  
0 0 0 0 1 1 0 
1 3 1 7 

输出:

5

附图:


解题思路:

最小转弯,不是最少步数。做法比较简单,不过是把拓展方式从4个方向一个格改成从4个方向撞到墙为止的一次性拓展完。(用老师的说法就是代价相同)

不过注意:封路和墙不要混为一谈。因为他是撞到墙才停止拓展,而碰到已经被走过的路只不过是不入队而不是不继续拓展。(被卡了好一会qAq)


贴代码时间:

#include<cstdio>
using namespace std;
int head,tail,n,m,state[10001][3],c,s,x,y,qx,qy;
bool ok[101][101],a[101][101];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};//拓展方向
void bfs()
{head=0;tail=1;do{head++;//出队for (int i=0;i<4;i++)//4个方向{x=state[head][0];y=state[head][1];int j=1;while (!a[x+dx[i]*j][y+dy[i]*j] && x+dx[i]*j<=n && y+dy[i]*j<=m && x+dx[i]*j>0 && y+dy[i]*j>0)//如果碰到墙或边缘就结束拓展{if (!ok[x+dx[i]*j][y+dy[i]*j])//如果已经走过的路线就不入队{tail++;//入队state[tail][0]=x+dx[i]*j;state[tail][1]=y+dy[i]*j;//储存位置state[tail][2]=state[head][2]+1;//储存转弯数ok[x+dx[i]*j][y+dy[i]*j]=true;//已经走过该地if (x+dx[i]*j==qx && y+dy[i]*j==qy)//结束判断{s=state[tail][2];return;}}j++;//下一个拓展}}}while(head<tail);//空队退出
}
int main()
{scanf("%d%d\n",&n,&m);		for (int i=1;i<=n;i++){for (int j=1;j<=m;j++){scanf("%d",&c);if (c!=0) a[i][j]=true;}}scanf("%d%d%d%d",&state[1][0],&state[1][1],&qx,&qy);//输入不解释bfs();//函数不解释printf("%d",s-1);//输出不解释
}

最后的压轴题:麻将游戏

在一种"麻将"游戏中,游戏是在一个有W*H格子的矩形平板上进行的。每个格子可以放置一个麻将牌,也可以不放(如图所示)。玩家的目标是将平板上的所有可通过一条路径相连的两张相同的麻将牌,从平板上移去。最后如果能将所有牌移出平板,则算过关。
  这个游戏中的一个关键问题是:两张牌之间是否可以被一条路径所连接,该路径满足以下两个特性:
  1. 它由若干条线段组成,每条线段要么是水平方向,要么是垂直方向。
  2. 这条路径不能横穿任何一个麻将牌 (但允许路径暂时离开平板)。
  这是一个例子:


  在(1,3)的牌和在(4, 4)的牌可以被连接。(2, 3)和(3, 4)不能被连接。
  你的任务是编一个程序,检测两张牌是否能被一条符合以上规定的路径所连接。 


输入:输入文件的第一行有两个整数w,h (1<=w,h<=75),表示平板的宽和高。接下来h行描述平板信息,每行包含w个字符,如果某格子有一张牌,则这个格子上有个'X',否则是一个空格。平板上最左上角格子的坐标为(1,1),最右下角格子的坐标为(w,h)。接下来的若干行,每行有四个数x1, y1, x2, y2 ,且满足1<=x1,x2<=w,1<=y1,y2<=h,表示两张牌的坐标(这两张牌的坐标总是不同的)。如果出现连续四个0,则表示输入结束。

5 4
XXXXX
X   X
XXX X
 XXX 
2 3 5 3
1 3 4 4
2 3 3 4
0 0 0 0


输出:

输出文件中,对于每一对牌输出占一行,为连接这一对牌的路径最少包含的线段数。如果不存在路径则输出0。

4

3

0


解题思路:这道题卡了挺久的,近5个小时才做出来。这道题一看就是第三题的升级版,只要注意可以走外围和每次把封路还原就Ok了o(>﹏<)o


终极代码时间:

#include<cstdio>
using namespace std;
int head,tail,state[5930][3],n,m,s,x1,x2,y1,y2;
bool a[77][77],walk[77][77];
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};//4个方向
char c;
void bfs(int x,int y,int px,int py)
//计算从(x,y)到(px,py)的最小转弯数
//这里不讲了,详见第3题
{head=0;tail=1;state[1][0]=x;state[1][1]=y;state[1][2]=0;do{head++;for (int i=0;i<4;i++){x=state[head][0];y=state[head][1];int j=1;while (!a[x+dx[i]*j][y+dy[i]*j] && x+dx[i]*j<=n+1 && y+dy[i]*j<=m+1 && x+dx[i]*j>=0 && y+dy[i]*j>=0){if (!walk[x+dx[i]*j][y+dy[i]*j]){tail++;state[tail][0]=x+dx[i]*j;state[tail][1]=y+dy[i]*j;state[tail][2]=state[head][2]+1;walk[x+dx[i]*j][y+dy[i]*j]=true;if (x+dx[i]*j==px && y+dy[i]*j==py){s=state[tail][2];return;}}j++;}}}while(head<tail);
}
int main()
{scanf("%d%d",&m,&n);//输入,注意是反过来的c=getchar();//读第一行的换行符for (int i=1;i<=n;i++){int j=0;while ((c=getchar())!='\n'){j++;if (c=='X') a[i][j]=true;//处理可否通行}}	x1=1;while (x1!=0 || y1!=0 || x2!=0 || y2!=0)//如果都为零就退出{scanf("%d%d%d%d",&y1,&x1,&y2,&x2);//输入,注意是反过来的if (x1!=0 && y1!=0 && x2!=0 && y2!=0)//如果都不为0{for (int i=0;i<=n+1;i++)for (int j=0;j<=m+1;j++) {walk[i][j]=false;}//还原封路s=0;//还原a[x2][y2]=false;//解掉终点的封锁bfs(x1,y1,x2,y2);//求a[x2][y2]=true;//打开终点的封锁printf("%d\n",s);}}
}


好了,广搜题目就那么多。↖(^ω^)↗

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谈一下我们是怎么做数据库单元测试(Database Unit Test)的

背景介绍 最近在团队在做release之前的regression,把各个feature分支merge回master之后发现DB的单元测试出现了20多个失败的test cases。之前没怎么做过DB的单元测试&#xff0c;正好借这个机会熟悉一下写DB单元测试的流程。 这篇博文中首先介绍一下在我们的特定项目场景中是…

JavaFX官方教程(十)之转换类型和示例

翻译自 Transformation Types and Examples 本文档描述了特定的转换并提供了代码示例。 转换 平移变换沿着相对于其初始位置的一个轴将节点从一个位置移动到另一个位置。木琴条的初始位置由x&#xff0c;y和z坐标定义。在实施例2-1中&#xff0c;初始位置值由指定的xStart&a…

ssl2293-暗黑游戏【dp练习题】

题目&#xff1a; 暗黑游戏中&#xff0c;装备直接决定玩家人物的能力。可以使用Pg和Rune购买需要的物品。暗黑市场中的装备&#xff0c;每件有不同的价格&#xff08;Pg和Rune&#xff09;、能力值、最大可购买件数。Kid作为暗黑战网的一个玩家&#xff0c;当然希望使用尽可能…

java知识点整理

1.char类型可以整型类型的值 2.变量的命名规则&#xff1a; (1)由字母、、$ 开头的 (2)后面部分可以拾字母、数字、下划线、$ (3)不能是java的关键词 (4)变量名要有意义 3.0是偶数 4.数据类型转换规则&#xff1a; int(源类型) a 1.0(目标类型); (1)源类型大于目标类型&#…

比特(bit)和字节(byte)(1byte=8bit)

一个0或者一个1存储为一个比特(bit)&#xff0c;是计算机中最小的存储单位。 计算机中是最基本的存储单元是字节(byte) 。每个字节由8个比特构成。

定位

绝对定位 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>.div1{height: 200px;width: 200px;background-color: gray;/*绝对定位 基于父级标签原点移开以后会自动释放父级标签原点位置*/po…

Web前端知识体系精简

Web前端技术由html、css和javascript三大部分构成&#xff0c;是一个庞大而复杂的技术体系&#xff0c;其复杂程度不低于任何一门后端语言。而我们在学习它的时候往往是先从某一个点切入&#xff0c;然后不断地接触和学习新的知识点&#xff0c;因此对于初学者很难理清楚整个体…

JavaFX官方教程(十一)之动画基础

翻译自 动画基础 动画基础提供基本动画概念&#xff0c;包含以下部分&#xff1a; 转变 时间线动画 插值 JavaFX中的动画可以分为时间轴动画和过渡。本章提供了每种动画类型的示例。 Timeline并且Transition是javafx.animation.Animation该类的子类。有关特定类&#xff…

《金色梦乡》金句摘抄(十一)

System.out.println("《金色梦乡》"); System.out.println("小说类型的书就是比散文类型的书好看"); System.out.println("通俗易懂"); System.out.println("今天准备看完");从一开始他就觉得难以置信&#xff0c;感觉就像是身处迷雾当…

ssl2295-暗黑破坏神【dp练习】

题目&#xff1a; 无聊中的小x玩起了Diablo I... 游戏的主人公有n个魔法 每个魔法分为若干个等级&#xff0c;第i个魔法有p[i]个等级(不包括0) 每个魔法的每个等级都有一个效果值&#xff0c;一个j级的i种魔法的效果值为w[i][j] 魔法升一级需要一本相应的魔法书 购买魔法书…

内存VS硬盘

一个程序和它的数据在被CPU执行前必须移到计算机的内存 中。 原因 内存存取数据的速度比硬盘的存取速度快10倍&#xff0c;在某些环境里&#xff0c;硬盘和内存之间的速度差距可能会更大。而CPU的速度比内存不知还要快多少倍。当我们把程序从硬盘放到内存以后&#xff0c;CPU…

依赖注入之Autofac使用总结

依赖倒置&#xff1f;控制反转&#xff08;IOC&#xff09;? 依赖注入&#xff08;DI&#xff09;&#xff1f; 你是否还在被这些名词所困扰&#xff0c;是否看了大量理论文章后还是一知半解了&#xff1f; 今天我想结合实际项目&#xff0c;和正在迷惑中的新手朋友一起来学…

JavaFX官方教程(十二)之树动画示例

翻译自 树动画示例 本章提供有关树动画示例的详细信息。您将了解场景中的所有元素是如何创建和动画的。 图4-1显示了带树的场景。 图4-1树动画 项目和要素 树动画项目由几个文件组成。每个元素&#xff0c;如树叶&#xff0c;草叶等&#xff0c;都是在不同的类中创建的。在…

《走遍中国》珍藏版(一)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");北京、天津…

MySQL建表,DML,DDL,约束,外键策略

创建数据库表 CREATE TABLE student( sno int (6), sname VARCHAR(10), sex CHAR(1), age INT(2), enterdate date, classname VARCHAR(10), email VARCHAR(15) ); – 查看表的结构 desc student – 查看表的数据 SELECT * FROM student DML – 查询表的数据 SELECT * FRO…

ssl1197-质数和分解【dp练习】

Description   任何大于 1 的自然数 n&#xff0c;都可以写成若干个大于等于 2 &#xff0c;且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况)&#xff0c;并且可能有不止一种质数和的形式。例如9 的质数和表达式就有四种本质不同的形式&#xff1a; 9 …

像素密度(衡量屏幕显示能力)

像素密度√[(长度像素数)^2(宽度像素数)^2]/屏幕尺寸 eg:

通过Roslyn构建自己的C#脚本(更新版)

之前写过文章介绍过如何通过Roslyn构建自己的C#脚本&#xff0c;但那篇文章是参考自Roslyn CTP版的&#xff0c;记得本来想等到Roslyn正式版出来重新更新一下文档的&#xff0c;不过记得后来Roslyn是跳票了的&#xff0c;Scripting API在正式版本中都一度被移除了&#xff0c;这…

JavaFX官方教程(十三)之应用效果

翻译自 Applying Effects 创建视觉效果包含以下主题&#xff1a; 混合效果 绽放效果 模糊效果 投影效果 内阴影效果 反射 照明效果 透视效果 创建一系列效果 介绍如何使用视觉效果来增强JavaFX应用程序的外观。 所有效果都位于javafx.scene.effect包中&#xff0c;…

《走遍中国》珍藏版(二)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");大门两侧傲…