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的,所以这里保险一点,也偷懒一下,只选到10
		continue;
	//不成功,继续开始`敲击	
	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;
	}
	else
		cout<<"此题在你现在的电脑配置下无解!"<<endl;
	return 0;
}



//思路分析:
//其实本质敲地鼠就是是三个阶段
//敲部分:寻找还在地上的地鼠,敲他,count+1,然后存储敲前的地图,变化敲后的地图,存储敲击线路
//判断是否成功
//判断是不是最优解
//敲,判断游戏成功了吗?判断是不是最优解

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

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

相关文章

软件工程案例学习-图书管理系统-面向对象方法

文档编号&#xff1a;LMS_1 版 本 号&#xff1a;V1.0 ** ** ** ** ** ** 文档名称&#xff1a;需求分析规格说明书 项目名称&#xff1a;图书管理系统 项目负责人&#xff1a;计敏 胡杰 ** ** …

开式双比例泵控制放大器

比例泵PQ控制放大器的主要作用是通过接收来自控制器的信号&#xff0c;并将其转换为适当的电流信号&#xff0c;以驱动变量泵。这种控制方式可以实现对泵输出流量和压力的精确控制&#xff0c;从而实现节能和提高效率的目的。比例泵PQ控制放大器通常用于节能型泵控制系统中&…

【Linux系列】tail查询使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【6D位姿估计】ZebraPose 层次化分组策略 由粗到细的表面编码

前言 本文介绍6D位姿估计的方法ZebraPose&#xff0c;也可以称为六自由度物体姿态估计&#xff0c;输入单张图片&#xff0c;输出物体的三维位置和三维方向。 它来自CVPR2022的论文&#xff0c;通过层次化分组策略&#xff0c;高效地编码物体表面的信息。 ZebraPose提出了一…

运维自动化之 ansible

目录 一 常见的自动化运维工具 &#xff08;一&#xff09;有哪些常见的 自动化运维工具 &#xff08;二&#xff09;为什么后面都变成用 ansible 二 ansible 基本介绍 1&#xff0c; ansible 是什么 2&#xff0c;ansible能干什么 3&#xff0c;ansible 工作原…

Linux网络—PXE高效批量网络装机

目录 一、部署PXE远程安装服务 1、搭建PXE远程安装服务器 1&#xff09;安装并启用 TFTP 服务 2&#xff09;安装并启用 DHCP 服务 3&#xff09;准备 Linux 内核、初始化镜像文件 4&#xff09;准备 PXE 引导程序 5&#xff09;安装FTP服务&#xff0c;准备CentOS 7 安…

OpenCV 入门(一) —— OpenCV 基础

OpenCV 入门系列&#xff1a; OpenCV 入门&#xff08;一&#xff09;—— OpenCV 基础 OpenCV 入门&#xff08;二&#xff09;—— 车牌定位 OpenCV 入门&#xff08;三&#xff09;—— 车牌筛选 OpenCV 入门&#xff08;四&#xff09;—— 车牌号识别 OpenCV 入门&#xf…

Springboot框架web开发实用功能-02

在些模块中汇总了一些web开发常用的配置和功能。 涉及的模块 springboot-common-config&#xff0c; 端口号&#xff1a;17000 Springboot框架web开发常用功能 Restful接口定义 查询参数 Data public class QueryParam {private String key;private String value; }Control…

MATLAB实现杜拉德公式和凯夫公式的计算固液混合料浆临界流速

MATLAB实现杜拉德公式和凯夫公式的计算固液混合料浆临界流速: 杜拉德公式是用来计算非均质固液混合料浆在输送管中的临界速度的公式&#xff0c;具体形式为&#xff1a; uL FL (2gD / (ρ0 - ρ1))^(1/2) 其中&#xff1a; uL&#xff1a;表示料浆的临界速度&#xff0c;…

Hbase 常用shell操作

目录 1、创建表 1.1、启动HBase Shell 1.2、创建表 1.3、查看表 1.4、删除表 2、插入数据 2.1、put命令 3、查看数据 3.1、get命令 3.2、查询数据中文显示 4、更新数据 4.1、使用put来更新数据 5、删除数据 5.1、delete命令 5.2、删除指定列的数据 5.3、delete…

Pycharm debug 运行报错 (RuntimeError: cannot release un-acquired lock)

问题描述&#xff1a; 最近再跑一个 flask应用&#xff0c;Pycharm 运行没问题&#xff0c;debug断点启动时报错 如下&#xff1a; 解决方案&#xff1a; 在环境变量中增加 GEVENT_SUPPORTTrue 启动成功&#xff01;

libcity笔记:添加新模型(以RNN.py为例)

创建的新模型应该继承AbstractModel或AbstractTrafficStateModel 交通状态预测任务——>继承 AbstractTrafficStateModel类轨迹位置预测任务——>继承AbstractModel类 1 AbstractTrafficStateModel 2 RNN 2.1 构造函数 2.2 predict 2.3 calculate_loss

博客系统项目测试报告

文章目录 一.报告概要二.测试环境三.手工测试用例四.编写测试用例五.自动化测试Selenium测试项目主要特点 一.报告概要 项目概要 本项目是一个全功能的个人博客系统&#xff0c;旨在提供一个用户友好、功能全面的平台&#xff0c;允许用户注册、登录、浏览博客、查看详细内容、…

Mac跑llama.cpp过程中遇到的问题

原repo 在华为手机上安装termux、下载库&#xff1a;顺利在电脑上安装Android NDK&#xff1a;先下载Android Studio&#xff0c;再在里面下载Android SDK 安装Android Studio时&#xff0c;SDK的某些组件总是下载不成功。后来关了梯子、改了hosts&#xff0c;重新安装就成功了…

Golang | Leetcode Golang题解之第73题矩阵置零

题目&#xff1a; 题解&#xff1a; func setZeroes(matrix [][]int) {n, m : len(matrix), len(matrix[0])col0 : falsefor _, r : range matrix {if r[0] 0 {col0 true}for j : 1; j < m; j {if r[j] 0 {r[0] 0matrix[0][j] 0}}}for i : n - 1; i > 0; i-- {for …

Go实现树莓派控制舵机

公式说明 毫秒&#xff08;ms&#xff09;是时间的单位&#xff0c;赫兹&#xff08;Hz&#xff09;是频率的单位&#xff0c;而DutyMax通常是一个PWM&#xff08;脉冲宽度调制&#xff09;信号中表示最大占空比的值。以下是它们之间的关系和一些相关公式&#xff1a; 频率&…

【华为】路由策略小实验

【华为】软考中级-路由策略实验 实验需求拓扑配置AR1AR2需求1需求2 AR3 检验 实验需求 1、让 R3 可以学到R1的 192.168.10.0/24和192.168.20.0/24的 路由&#xff0c;不能学到192.168.30.0/24。 2、让 R1可以学到 R3 的 172.16.20.0/24和172.16.30.0/24的路由&#xff0c;不能…

opencv图像处理详细讲(二)

联通组件分析 联通组件定义&#xff1a;像素值相同&#xff0c;通过四邻域或者八邻域相互连通的像素块。 换句话说&#xff0c;就是使用四邻域或八邻域的连通性&#xff0c;遍历图像的像素&#xff0c;并确定像素值相同并且连通的像素块&#xff0c;将它们标记为一个联通组件 两…

虚拟机VM VirtualBox安装openEuler+UKUI的安装和卸载_2024

虚拟机VM VirtualBox安装openEuler ps. 建议先看最后的其他 下载openEuler openEuler官网下载 一般来说标准版就够用了 使用虚拟机VM VirtualBox安装openEuler 新建虚拟机 修改用户名密码&#xff0c;建议修改&#xff0c;虽然之后还可以通过命令行修改&#xff08;注意密…

pyecharts绘制世界动态轨迹图(v0.5.X与v1.X版本对比)

一、问题引入 pyecharts官网&#xff1a;https://pyecharts.org/#/zh-cn/intro 在使用Geo或者GeoLines绘制动态轨迹图时&#xff0c;如果所选地区是中国的省份或者城市&#xff0c;是能够匹配到对应的经纬度并且正常绘制的&#xff1b;如果所选地区涉及到其他国家或者国外城市&…
最新文章