Problem 5: Whack-A-Mole打地鼠

实战题:打地鼠

内容如附件所示:

测试数据为:1,2,4,8,9,10,11,14   答案为:10,2,4

原始分布:

击打10号    

 

击打2号   

  

击打4号

     

要求,所示实例解以图示的方式给出,并且5组测试数据都需要测试,还要有无解数据测试,及游戏方式(给出初始状态,由用户输入敲几号,给出变化状态)。代码要给详细注释并贴图上传,运行结果贴图上传,源文件做为附件上传。

原题大概是

//欢迎来到打地鼠的游戏
#include<bits/stdc++.h>
using namespace std; 
int b[6][6];//创建棋盘
int dx[5]={0,-1,0,1,0};int dy[5]={0,0,1,0,-1};//存储四个方位
//对于队列嘛,我们知道是用来存储答案的,仿照迷宫每个格子都有自己的属性
//而且每打一次,地图变一次,所以我们可以设立一下结构体struct node//敲击节点 
{int now[6][6];//为什么要count,主要是要算出最短的int count;//记录敲了多少只老鼠,哦不,地鼠int row[20];//行///存储每次敲击的那只老鼠,最后输出这个答案int col[20];//列/其实我们最多也尝试到10
}bg,temp,ans;//使用BFS广度优先搜索
void Whack(int x,int y)//x,y表示初始位置,就是敲哪只老鼠,哦不,地鼠
{queue<node> q;//创建队列,偷懒开始,不过这个队列的作用和迷宫作用相同//首敲定义bg.count=1;//第一次敲击bg.row[bg.count]=x;bg.col[bg.count]=y;//导入第一次敲的老鼠位置for(int i=1;i<=4;i++)	for(int j=1;j<=4;j++)bg.now[i][j]=b[i][j];	//导入敲前的地图for(int i=0;i<5;i++)//包括他本身我们也一起处理if(x+dx[i]<=4&&x+dx[i]>0&&y+dy[i]<=4&&y+dy[i]>0)//不越界bg.now[x+dx[i]][y+dy[i]]=1-b[x+dx[i]][y+dy[i]];//开始敲 ,执行反处理q.push(bg);//推入第一个敲击路线,开始搜索//每次全排列返回位置while(!q.empty()){//这里其实就是永远的1//读者注意,这里的bg现在是当前路线的意思bg=q.front();			//取出当前全排列中未完成路线q.pop();				//取完就删,否则占我内存int flag=1;	//成功否,成功为1,不成功为0//判断游戏成功了吗?for(int j=1;j<=4;j++)//遍历{for(int k=1;k<=4;k++)	if(bg.now[j][k])	//还没成功 {flag=0;			//判断标志变为0 break;		}if(!flag)		//跳出二重循环break;}//成功,寻找最优解if(flag)				{						if(ans.count>bg.count)		//看看是不是更短{for(int y=1;y<=bg.count;y++)	//导入这个较短路线的解法 {ans.row[y]=bg.row[y];ans.col[y]=bg.col[y];}ans.count=bg.count;}return;}if(bg.count>=10)		//样例中没有一个路线超过8的,所以这里保险一点,也偷懒一下,只选到10continue;//不成功,继续开始`敲击	for(int j=1;j<=4;j++){//for(int k=1;k<=4;k++){if(bg.now[j][k])		//遍历当前的地图,看看哪只老鼠没下地 {temp.count=bg.count+1;	//,找到,开敲,敲地鼠次数加1//此时全排列进行到的支路 for(int m=1;m<=4;m++)for(int n=1;n<=4;n++)temp.now[m][n]=bg.now[m][n];	//将敲前的地图存储到新结构体中 	for(int o=0;o<5;o++){if(j+dx[o]<=4&&j+dx[o]>=1&&k+dy[o]<=4&&k+dy[o]>=1)	//找图内的点 temp.now[j+dx[o]][k+dy[o]]=1-temp.now[j+dx[o]][k+dy[o]];//将所敲地鼠及其周围四格状态进行改变 ,}//早就想单独把这个做成函数了,但是二维数组,我不会for(int l=1;l<=bg.count;l++)	//存储之前每次敲的位置 {temp.row[l]=bg.row[l];temp.col[l]=bg.col[l];}temp.row[temp.count]=j;temp.col[temp.count]=k;		//存储这次敲的位置 q.push(temp);//导入队列//对于第一次而言,第一次敲完展开,得到全排列}}}	}
}void print()
{for(int i=1;i<=4;i++){for(int j=1;j<=4;j++){	if(b[i][j]==1)cout<<"●";//直接cv(扶额苦笑)else if(b[i][j]==0)cout<<"○";}cout<<endl;}
}void gj(int x,int y)
{for(int i=0;i<5;i++)if(x+dx[i]<=4&&x+dx[i]>0&&y+dy[i]<=4&&y+dy[i]>0)b[x+dx[i]][y+dy[i]]=1-b[x+dx[i]][y+dy[i]];
}
void zuobiao(int p,int &x,int&y)
{if(p>0&&p<=16){if(p%4==0){x=5-p/4;y=4;}else{x=4-p/4;y=p%4;}
}
}int main(){ans.count=50;int a[6][6],o=1,p=1,x,y;cout<<"//欢迎来到打地鼠游戏!//"<<endl;cout<<"接下来您将会看到一个四乘四的棋盘,其大致坐标方位如下:"<<endl;for(int i=4;i>=1;i--)//样例棋盘{		for(int j=1;j<=4;j++){a[i][j]=o;o++;}}for(int i=1;i<=4;i++){for(int j=1;j<=4;j++)cout<<setw(3)<<a[i][j]<<" ";cout<<endl;}cout<<"在接下来的测试数据中,请您给出初始状态下哪些位置会出现地鼠(当输入0时代表结束):"<<endl;for(int i=1;i<=4;i++)//初始化原本棋盘for(int j=1;j<=4;j++)b[i][j]=0;while(p){//这里本来的思路是为了防止两边越界,第一个元素设为(1,1)cin>>p;//后面想想,好像也没必要(0,0)的算法其实也不影响if(p>0&&p<=16){if(p%4==0){x=5-p/4;y=4;}else{x=4-p/4;y=p%4;}b[x][y]=1;}}cout<<"分析数据成功!初始转态如下:"<<endl;	cout<<"(ps:●代表有地鼠,○代表洞)"<<endl<<endl;print();cout<<endl;for(int i=1;i<=4;i++)    //bfs遍历 第一次锤地鼠的格子 {for(int j=1;j<=4;j++){if(b[i][j]){Whack(i,j);}}}if(ans.count<=9&&ans.count>0)	//步数小于等于10说明有至少一个解 {cout<<"分析成功!现在为您演习最短路径(这个操作后世称为挂机)"<<endl<<endl;for(int i=1;i<=ans.count;i++){int x,y;cout<<"敲击"<<4*(4-ans.row[i])+ans.col[i]<<"号位"<<endl;zuobiao(4*(4-ans.row[i])+ans.col[i],x,y);gj(x,y);print();cout<<endl;}cout<<"综上,最短路径为:";for(int i=1;i<=ans.count;i++)cout<<4*(4-ans.row[i])+ans.col[i]<<" ";	//将坐标转换为序号输出 cout<<endl<<endl;double shijian = clock() / CLOCKS_PER_SEC;cout << "本解法耗时" << shijian << "秒" << endl;}elsecout<<"此题在你现在的电脑配置下无解!"<<endl;return 0;
}//思路分析:
//其实本质敲地鼠就是是三个阶段
//敲部分:寻找还在地上的地鼠,敲他,count+1,然后存储敲前的地图,变化敲后的地图,存储敲击线路
//判断是否成功
//判断是不是最优解
//敲,判断游戏成功了吗?判断是不是最优解

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

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

相关文章

Labels and Databases for Mac:强大的标签与数据库管理工具

Labels and Databases for Mac是一款集标签制作与数据库管理于一体的强大工具&#xff0c;专为Mac用户打造&#xff0c;旨在提供高效、便捷的标签制作与数据管理体验。 这款软件拥有丰富的内置标签格式&#xff0c;用户可轻松创建各种标签、信封和卡片&#xff0c;满足个性化需…

PopChar for Mac v10.1激活版:特殊字符输入工具

PopChar for Mac是一款专为Mac用户设计的字符输入工具&#xff0c;其简单直观的功能使得查找和插入特殊字符变得轻而易举。 PopChar for Mac v10.1激活版下载 首先&#xff0c;PopChar为Mac提供了访问所有字体字符的能力&#xff0c;包括那些难以通过键盘直接输入的字符。用户只…

STM32编译前置条件配置

本文基于stm32f104系列芯片&#xff0c;记录编程代码前需要的操作&#xff1a; 添加库文件 在ST官网下载标准库STM32F10x_StdPeriph_Lib_V3.5.0&#xff0c;解压后&#xff0c;得到以下界面 启动文件 进入Libraries&#xff0c;然后进入CMSIS&#xff0c;再进入CM3&#xff…

【DevOps】探索Linux命令行世界:深入了解Shell的力量

目录 一、Linux Shell 详细介绍 1. Shell基础概念 2. Shell的功能特性 3. 常用Shell命令与技巧 4. 高级Shell特性与实践 二、常见的Shell及其比较 1. Bash (Bourne Again SHell) 2. Zsh (Z Shell) 3. Fish (Friendly Interactive SHell) 4. Ksh (Korn SHell) 5. Csh …

青春送温暖 立夏寄真情

&#xff08;通讯员&#xff1a;赵灿飞 图&#xff1a;杨美、孙红浪&#xff09; 在青春洋溢的五月&#xff0c;为传承中华民族尊老敬老的传统美德&#xff0c;促进当代青年与老人的跨代交流&#xff0c;增强青年的社会责任感和使命感&#xff0c;传递正能量和关爱困难群体…

linux下sd卡的备份与还原

在Ubuntu上制作SD卡备份镜像&#xff0c;你可以使用dd命令。以下是一个基本的步骤和示例代码&#xff1a; 插入SD卡到电脑。确定SD卡设备路径&#xff0c;使用lsblk或sudo fdisk -l命令。确定备份镜像文件的路径。使用dd命令制作备份。 示例代码&#xff1a; bash# 查看连接的…

ubuntu 安装单节点HBase

下载HBase mkdir -p /home/ellis/HBase/ cd /home/ellis/HBase/ wget https://downloads.apache.org/hbase/2.5.8/hbase-2.5.8-bin.tar.gz tar -xvf hbase-2.5.8-bin.tar.gz安装java jdk sudo apt install openjdk-11-jdksudo vim /etc/profileexport JAVA_HOME/usr/lib/jvm/…

(delphi11最新学习资料) Object Pascal 学习笔记---第11章第1节(混合引用中的错误)

11.1.3 混合引用中的错误 ​ 在使用对象时&#xff0c;你通常应该只使用对象变量或接口变量来访问它们。混合使用这两种方法会破坏对象 Pascal 所提供的引用计数机制&#xff0c;并可能导致极难跟踪的内存错误。在实践中&#xff0c;如果你决定使用接口&#xff0c;你可能应该…

windows驱动开发-内核编程技术汇总(五)

使用安全字符串函数 和应用层不一样的是&#xff0c;windows内核完全使用Unicode字符串&#xff0c;许多支持AsciiC的windowsAPI&#xff0c;是在应用层完成项Unicode的切换的。许多系统安全问题是由缓冲区处理不善和生成的缓冲区溢出引起的。 糟糕的缓冲区处理通常与字符串操…

利用super解决问题

1 问题 在继承问题中&#xff0c;我们可以怎么使用super函数呢&#xff1f; 2 方法 super() 函数是用于调用父类(超类)的一个方法&#xff0c;目的是用来解决多重继承时父类的查找问题。Python中类的初始化都是init(), 所以父类和子类的初始化方式都是init(), 但是如果子类初始…

代码随想录算法训练营第56天| 583. 两个字符串的删除操作*、 72. 编辑距离*

583. 两个字符串的删除操作* 力扣题目链接 代码 示例代码 class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size() 1, vector<int>(word2.size() 1));for (int i 0; i < word1.size(); i) dp…

代码随想录算法训练营Day12 | 二叉树理论基础、递归遍历、迭代遍历、统一迭代

今日收获&#xff1a; 二叉树的递归遍历二叉树的迭代遍历&#xff0c;中序的迭代法和前、后序不一样二叉树的统一迭代法主要是用了标记法来实现&#xff08;要处理的节点放入栈之后&#xff0c;紧接着放入一个空指针作为标记&#xff09; 二叉树理论基础篇 题目分类 题目分…

第一篇:刚接触测试你应该知道什么

欢迎你接触软件测试这一行业。 刚接触它时&#xff0c;你肯定或多或少会有疑惑&#xff0c;我该做什么&#xff1f;大家口口相传的软件测试就是 【点点点】 真的是你日常的工作吗&#xff1f; 那么本文我将陪你一起&#xff0c;对我们刚接触到测试这个工作以后&#xff0c;应该…

创建混合索引的原则

创建SQL混合索引的原则如下&#xff1a; 选择合适的列&#xff1a;混合索引应该包含那些经常用于WHERE、JOIN、ORDER BY和GROUP BY子句中的列。选择最常被查询的列&#xff0c;以提高查询的性能。 考虑列的顺序&#xff1a;混合索引的列的顺序应该根据查询的频率和使用的方式进…

x86中汇编伪指令.byte,.short,.int,.long,.word的理解

1[.byte] .byte expressions: 定义一个字节, 并为之分配空间. 2[.short] .short expressions: 定义一个短整型, 并为之分配空间. 3[.int] .int expressions: 定义一个整型,并为之分配空间. 4[.long] .long expressions: 定义一个长整型, 并为之分配空间. 5[.word] .word expres…

产品人生(5):从“敏捷开发”到“四化时间管理法”

人生如产品&#xff0c;产品映人生&#xff0c;借鉴产品思维&#xff0c;快速提升软技能&#xff01; 在互联网的敏捷开发实践中&#xff0c;经常会用到“流程化、模板化、清单化、不断优化”的思想来提升开发的效率和产品质量&#xff0c;并确保团队能够快速响应市场变化。大…

cmake进阶:变量的作用域说明二(从函数作用域方面)

一. 简介 前一篇文章从函数作用域方面学习了 变量的作用域。文章如下&#xff1a; cmake进阶&#xff1a;变量的作用域-CSDN博客 本文继续从函数作用域方面学习了 变量的作用域。 二. 变量的作用域 1. 函数内定义与外部同名的变量 向顶层 CMakeLists.txt添加如下代码&a…

java08基础(值传递和引用传递 类和对象)

目录 一. 值传递和引用传递 1. 值传递 2. 引用传递 二. 面向对象思想 三. 类和对象 1. 类 2. 对象 2.1 使用 2.2 成员变量和局部变量区别 2.3 操作成员方法 2.4 this关键字(初始) 2.5 构造方法 (见java09) 一. 值传递和引用传递 1. 值传递 值传递是指在调用函数时将…

Open CASCADE学习|三重正交标架法则

三重正交标架&#xff08;Trihedron&#xff09; 定义:三重正交标架是在三维空间中定义的一个坐标系&#xff0c;由三个互相垂直的向量构成。这些向量分别是&#xff1a; 切线向量&#xff08;Tangent Vector&#xff09; - 表示曲线在某一特定点处的切线方向。 主法线向量&…

越权漏洞!

越权漏洞是指在一个系统或应用程序中存在某种不当的访问权限&#xff0c;使得攻击者可以获得比其应该拥有的权限更高的权限。这种漏洞可能允许攻击者执行未经授权的操作&#xff0c;例如访问他人的敏感数据、修改系统设置、执行恶意代码等。越权漏洞通常是由于设计或实现上的错…