Problem 5: Whack-A-Mole打地鼠

news2024/12/23 13:40:15

实战题:打地鼠

内容如附件所示:

测试数据为: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.coloradmin.cn/o/1646964.html

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

相关文章

力扣每日一练(螺旋矩阵)

54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,…

获取转转数据,研究完转转请求,tx在算法方面很友好。

本篇文章仅供学习讨论。 文章中涉及到的代码、实例&#xff0c;仅是个人日常学习研究的部分成果。 如有不当&#xff0c;请联系删除。 在研究完阿里的算法以后&#xff08;其实很难说研究完&#xff0c;还有很多内容没有研究透&#xff0c;只能说暂时告一段落&#xff09;&…

关于IDEA中项目中各个方法、引用、注解等全部报错的情况

今天打开项目弹出很多提示框&#xff0c;也没注意&#xff0c;然后突然发现项目所有都在报错&#xff0c;不管是启动类还是方法类&#xff0c;各种注解、方法、引用等全红了&#xff0c;随便打开一个都是密密麻麻全红。 首先排查依赖和JDK等引用问题&#xff0c;包括我们的mave…

jquery项目 html使用export import方式调用模块

jquery的老项目&#xff0c;引入vue3, 需要方便使用export, import方式引用一些常用的方法与常量 导出模块 export js/numberUtil.js /*** Description:* Author Lani* date 2024/1/10*//* * 【金额】 保留2位小数&#xff0c;不四舍五入 * 5.992550 >5.99 , 2 > 2.…

力扣:63. 不同路径 II

63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么…

C++:多继承虚继承

在C中&#xff0c;虚继承&#xff08;Virtual Inheritance&#xff09;是一种特殊的继承方式&#xff0c;用于解决菱形继承&#xff08;Diamond Inheritance&#xff09;问题。菱形继承指的是一个类同时继承自两个或更多个具有共同基类的类&#xff0c;从而导致了多个实例同一个…

Apache POI入门学习

Apache POI入门学习 官网地址 excel中使用到的类读取excel表格内容表格内容maven依赖方式一测试结果 方式二测试结果 向excel中写入数据方式一方式二方式三测试结果 从 Excel 工作表中的公式单元格读取数据测试结果 Excel 工作表中写入公式单元格从受密码保护的Excel中读取数据…

opencv图片的平移-------c++

图片平移 cv::Mat opencvTool::translateImage(const cv::Mat& img, int dx, int dy) {// 获取图像尺寸int rows img.rows;int cols img.cols;// 定义仿射变换矩阵cv::Mat M (cv::Mat_<float>(2, 3) << 1, 0, dx, 0, 1, dy);// 进行仿射变换cv::Mat dst;cv…

Linux-信号概念

1. 什么是信号 信号本质是一种通知机制&#xff0c;用户or操作系统通过发送信号通知进程&#xff0c;进程进行后续处理 在日常生活中就有很多例子&#xff0c;比如打游戏方面王者荣耀的“进攻”&#xff0c;“撤退”&#xff0c;“请求集合”&#xff0c;“干得漂亮&#xff01…

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

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

第七节课《OpenCompass司南--大模型评测实战》

OpenCompass 大模型评测实战_哔哩哔哩_bilibili https://github.com/InternLM/Tutorial/blob/camp2/opencompass/readme.md InternStudio 一、通过评测促进模型发展 面向未来拓展能力维度&#xff1a;评测体系需增加新能力维度&#xff08;数学、复杂推理、逻辑推理、代码和…

[SUCTF 2019]CheckIn 1

解题步骤 上传木马图片&#xff0c;命名为b.php GIF89a <script languagephp>eval($_POST[cmd])</script>bp抓包&#xff0c;修改数据&#xff1b;然后可看到上传的文件 上传.user.ini文件&#xff0c;内容编写如下&#xff0c;然后bp抓包修改文件类型 GIF8…

MOS产品在光伏逆变器上的应用和产品选型

2023年全球光伏装机量表现优异&#xff0c;根据BloombergNEF统计数据&#xff0c;2023年全球光伏新增装机量444GW&#xff0c;同比增长76.2%&#xff0c;其中约一半新增装机量来自中国。 中国光伏新技术迭代不断&#xff0c;产业链降本增效加速。根据CPIA数据&#xff0c;2022年…

简述 BIO 、NIO 模型

BIO : 同步阻塞I/O&#xff08;Block IO&#xff09; 服务器实现模式为每一个连接一个线程&#xff0c;即客户端有连接请求时服务器就需要启动一个线程进行处理&#xff0c;如果这个连接不做任何事情会造成不必要的线程开销&#xff0c;此处可以通过线程池机制进行优化。 impo…

新的项目springboot

buybuyshenglombok <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency> 添加依赖 lombok package com.example.demo.pojo;import lombok.AllArgsConstructor; import lombok.Data; import …

【机器学习与实现】线性回归分析

目录 一、相关和回归的概念&#xff08;一&#xff09;变量间的关系&#xff08;二&#xff09;Pearson&#xff08;皮尔逊&#xff09;相关系数 二、线性回归的概念和方程&#xff08;一&#xff09;回归分析概述&#xff08;二&#xff09;线性回归方程 三、线性回归模型的损…

BigDecimal:踩坑

问题描述 两个BigDecimal相除, 抛了异常 原因分析&#xff1a; Java 中使用 BigDecimal 做除法运算的时候&#xff0c;值有可能是无限循环的小数&#xff0c;结果是无限循环的小数&#xff0c;就会抛出上面这个异常。 来看看源码&#xff1a; public BigDecimal divide(BigD…

马常旭新歌《如愿》:音乐界的“旭日”再现

在这个春暖花开的季节&#xff0c;音乐界又迎来了一股清新的“旭日”气息。是的&#xff0c;就在2024年4月17日&#xff0c;马常旭的新歌《如愿》&#xff08;旭日版&#xff09;在网易云音乐上线了&#xff01;一年的等待&#xff0c;终于迎来了他的音乐回归&#xff0c;给我们…

【3D基础】坐标转换——地理坐标投影到平面

汤国安GIS原理第二章重点 1.常见投影方式 https://download.csdn.net/blog/column/9283203/83387473 Web Mercator投影&#xff08;Web Mercator Projection&#xff09;&#xff1a; 优点&#xff1a; 在 Web 地图中广泛使用&#xff0c;易于显示并与在线地图服务集成。在较…

在echarts中使用geojson地图

以中国地图为例 先看效果 代码实现&#xff1a; <div id"refChinaMap" :style"{ width: 75%, height: 100% }"></div>import * as echarts from "echarts"; import ChinaJSON from "./chinaMap.json";const initChinaMa…