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…

青春送温暖 立夏寄真情

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

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/…

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

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

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

欢迎你接触软件测试这一行业。 刚接触它时&#xff0c;你肯定或多或少会有疑惑&#xff0c;我该做什么&#xff1f;大家口口相传的软件测试就是 【点点点】 真的是你日常的工作吗&#xff1f; 那么本文我将陪你一起&#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;例如访问他人的敏感数据、修改系统设置、执行恶意代码等。越权漏洞通常是由于设计或实现上的错…

淡茶怎么泡?

很多人都知道喝浓茶对身体不好&#xff0c;但是怎么冲泡淡茶却一知半解。按照《品深淡茶冲泡标准》中对绿茶冲泡淡茶的规定&#xff0c;冲泡的茶汤中咖啡碱不得高于31.67mg/100mL&#xff0c;可可碱不得高于2.67mg/mL&#xff0c;茶碱不得高于1.50mg/100mL&#xff0c;茶多酚不…

[C++核心编程-03]----C++函数提高学习

目录 引言 正文 01-函数提升简介 02-函数默认参数 03-函数占位参数 04-函数重载 05-函数重载的注意事项 总结 引言 函数在C编程中扮演着至关重要的角色&#xff0c;通过合理使用函数&#xff0c;可以提高程序的结构性、灵活性、可读性和维护性。因此&…

Guer完成对Gallium Semi的GaN产品组合的收购

预计到2024年6月&#xff0c;完整的射频氮化镓产品组合将完成整合 总部位于美国的Guerrilla RF (GUER)已完成对镓半导体公司GaN功率放大器和前端模块的全部收购。 自2024年4月26日起&#xff0c;GUER收购了Gallium Semiconductor先前发布的所有组件以及正在开发的新内核。此外…

软件测试与管理-白盒测试-基本路径测试法

知识点&#xff1a; 1.原理 是在程序控制流图的基础上&#xff0c;通过分析控制构造的环路复杂性&#xff0c;导出基本可执行路径的集合&#xff0c;然后根据可执行路径进行测试用例设计的方法。此方法设计出的测试用例需保证被测程序的每个可执行语句至少执行一次。 2.步骤 &a…

计算机SCI期刊,中科院2区,IF=6+,自引率低,专业认可度高!

一、期刊名称 Journal of King Saud University-Computer and Information Sciences 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;6.9 中科院分区&#xff1a;2区 出版方式&#xff1a;开放出版 版面费&#xff1a;$…

开源模型 Prometheus 2 能够评估其他语言模型,其效果几乎与 GPT-4 相当

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

在Codelab对llama3做Lora Fine tune微调

Unsloth 高效微调大模型的工具&#xff0c;通过Unsloth微调Llama3, Mistral, Gemma 速度提升2-5倍&#xff0c;内存减少70%&#xff01; Codelab 创建一个jupyter notebook 选择 T4 GPU 安装Fine tune 相关的lib %%capture import torch major_version, minor_version torch…

权益商城系统源码,支持多种支付方式

权益商城系统源码&#xff0c;支持多种支付方式&#xff0c;后台商品管理&#xff0c;订单管理&#xff0c;串货管理&#xff0c;分站管理&#xff0c; 会员列表&#xff0c;分销日志&#xff0c;应用配置。 上传到服务器&#xff0c;修改数据库信息&#xff0c;导入数据库&a…

Python中的分布式爬虫系统Scrapy与分布式任务队列的结合

随着互联网的不断发展&#xff0c;网络爬虫在数据采集和信息挖掘中发挥着重要作用。然而&#xff0c;单机爬虫往往难以应对大规模数据抓取的需求&#xff0c;因此&#xff0c;构建分布式爬虫系统成为了一种必然选择。本文将介绍如何利用 Python 中的 Scrapy 框架和分布式任务队…