openjudge_2.5基本算法之搜索_200:Solitaire

题目

200:Solitaire
总时间限制: 5000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB
描述
Solitaire is a game played on a chessboard 8x8. The rows and columns of the chessboard are numbered from 1 to 8, from the top to the bottom and from left to right respectively.
There are four identical pieces on the board. In one move it is allowed to:move a piece to an empty neighboring field (up, down, left or right),jump over one neighboring piece to an empty field (up, down, left or right).
在这里插入图片描述
There are 4 moves allowed for each piece in the configuration shown above. As an example let’s consider a piece placed in the row 4, column 4. It can be moved one row up, two rows down, one column left or two columns right.
Write a program that:
reads two chessboard configurations from the standard input,verifies whether the second one is reachable from the first one in at most 8 moves,
writes the result to the standard output.
输入
Each of two input lines contains 8 integers a1, a2, …, a8 separated by single spaces and describes one configuration of pieces on the chessboard. Integers a2j-1 and a2j (1 <= j <= 4) describe the position of one piece – the row number and the column number respectively.
输出
The output should contain one word YES if a configuration described in the second input line is reachable from the configuration described in the first input line in at most 8 moves, or one word NO otherwise.
样例输入
4 4 4 5 5 4 6 5
2 4 3 3 3 6 4 6
样例输出
YES

翻译

8*8的棋盘有四个棋子,输入四个棋子的位置和输出的位置,判断在8步内能不能走到。

理解

1.棋盘中四个棋子座位为一个布局作为整体操作,用struct,有四个横坐标,四个纵坐标。
请添加图片描述

2.四个棋子四个方向独立运行,只要没走过就走,宽搜,枚举到达目标布局。
请添加图片描述

3.标记棋盘走出哪些布局,4个坐标——8维数组,每两个是一个坐标。如始发布局k[4][4][4][5][5][4][6][5]=1。
4.最终落棋位置用布尔数组goal[9][9]表示,0-8(9个数)的数组,两个维度就是一对坐标。
要判断到终点没,就是四个棋子的位置都是终点标记位置
四个棋子有四个坐标,goal[4][4]=1,goal[4][5]=1,goal[5][4]=1, goal[6][5]=1都是1就说明到达目的地。
5.判断是否出界。
6.要判断是否重叠,如果重叠得还得走一次,再判断出界和重叠
走完后,如果没有出界,不是已走过,没有重叠,
再看是否到终点没
否则就加入队列,
请添加图片描述

代码

#include <bits/stdc++.h>
using namespace std;
struct cbord{//一张棋盘四个棋子坐标,到达该布局的步数
int x[4],y[4],step;
}s,b;//出发布局,宽搜队首布局
bool k[9][9][9][9][9][9][9][9],//88(1-8)棋盘上4个棋子坐标(42=8)宽搜标记
goal[9][9];//四个目标位置的坐标。
int d[4][2]={{0,-1},{-1,0},{0,1},{1,0}};//左上右下移动
bool reached(cbord c){//判定四个棋子位置是不是目标位置
for(int i=0;i<4;i++)
if(!goal[c.x[i]][c.y[i]])return 0;//有个棋子坐标不是目标位置就错
return 1;
}
bool overlap(cbord c,int x){//两棋子是否重叠了
for(int i=0;i<4;i++)
if(i!=x&&c.x[i]==c.x[x]&&c.y[i]==c.y[x])return 1;//有两个棋子位置重了
return 0;
}
void view(cbord c){
for(int i=0;i<4;i++)
cout<<c.x[i]<<“,”<<c.y[i]<<“\t”;
cout<<“=”<<c.step<<endl;
}
bool bfs(){
queue q;q.push(s);
k[s.x[0]][s.y[0]][s.x[1]][s.y[1]][s.x[2]][s.y[2]][s.x[3]][s.y[3]]=1;//标记四个棋子坐标位置已经到过
int x,y;
while(!q.empty()){//广搜
b=q.front();q.pop();
//view(b);
if(b.step>=8)continue;//取消超过8步的走法
if(reached(b))return 1;//到达目标布局
for(int i=0;i<4;i++){//四个棋子
//s=b;//不在这里,每个方向间无顺序相互独立
for(int j=0;j<4;j++){//四个方向
s=b;//拷贝布局,再改
s.x[i]+=d[j][0],s.y[i]+=d[j][1];//改坐标
if(s.x[i]<1||s.x[i]>8||s.y[i]<1||s.y[i]>8)continue;//出界了不要
if(overlap(s,i)){//重叠了
s.x[i]+=d[j][0],s.y[i]+=d[j][1];//可以跳
if(s.x[i]<1||s.x[i]>8||s.y[i]<1||s.y[i]>8)continue;//出界了不要
if(overlap(s,i))continue;//再重叠就不能要了
}
if(k[s.x[0]][s.y[0]][s.x[1]][s.y[1]][s.x[2]][s.y[2]][s.x[3]][s.y[3]])continue;//已经走过这个布局
k[s.x[0]][s.y[0]][s.x[1]][s.y[1]][s.x[2]][s.y[2]][s.x[3]][s.y[3]]=1;//标记
s.step++;//多一步
if(reached(s))return 1;//到达目标布局
q.push(s);//放进队列再宽搜
}
}
}
return 0;
}
int main(){
//freopen(“data.cpp”,“r”,stdin);
for(int i=0;i<4;i++)cin>>s.x[i]>>s.y[i];
int x,y;
for(int i=0;i<4;i++){
cin>>x>>y;goal[x][y]=1;//该位置是其中一个坐标。共有四个棋子位置
}
if(bfs())cout<<“YES”;
else cout<<“NO”;
return 0;
}

小结

宽搜就跟枚举一样,全试。
四个棋子四个方向没有先后顺序,相互独立是关键。
for(int i=0;i<4;i++){//四个棋子
//s=b;//不在这里,每个方向间无顺序相互独立
for(int j=0;j<4;j++){//四个方向
s=b;//拷贝布局,再改
s.x[i]+=d[j][0],s.y[i]+=d[j][1];//改坐标

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

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

相关文章

架构师系列-Docker(二)-部署微服务

安装部署nacos Nacos是阿里巴巴开源的一款支持服务注册与发现&#xff0c;配置管理以及微服务管理的组件。用来取代以前常用的注册中心&#xff08;zookeeper , eureka等等&#xff09;&#xff0c;以及配置中心&#xff08;spring cloud config等等&#xff09;&#xff0c;N…

数据结构——二叉树练习(深搜广搜)

数据结构——二叉树练习 路径之和深度优先算法和广度优先算法二叉搜索树判断一棵二叉树是否为搜索二叉树和完全二叉树 我们今天来看二叉树的习题&#xff1a; 路径之和 https://leetcode.cn/problems/path-sum-ii/ 这是一个典型的回溯&#xff0c;深度优先算法的题&#xff0c…

净初级生产力NPP数据

生态系统是地球上生命存在的舞台&#xff0c;而生态系统的能量来源之一是净初级生产力&#xff08;NPP&#xff09;。NPP是生态系统中植物通过光合作用将太阳能转化为有机物质的速率&#xff0c;是生态系统中生物量增长和能量积累的重要指标之一。 NPP的重要性 NPP反映了生态系…

python的turtle库画直线

1.画一条直线 让画笔从(0,0)划到&#xff08;100,100&#xff09;&#xff0c;在turtle中画笔是一只小乌龟。 import turtle turtle.setup(800,800,0,0)#turtle.setup(width,height,startx,starty)来设置窗口初始位置及大小 turtle.goto(100,100)2.画一条折线 left和right使小…

【UE5.1 C++】提升编译速度

步骤 1. 在“C:\Users\用户\AppData\Roaming\Unreal Engine\UnrealBuildTool”目录下找到“BuildConfiguration.xml”文件 打开“BuildConfiguration.xml”&#xff0c;添加如下部分内容 <?xml version"1.0" encoding"utf-8" ?> <Configuratio…

TypeScript入门第一天,所有类型+基础用法+接口使用

表示逻辑值&#xff1a;true 和 false。在JavaScript和TypeScript里叫做boolean | | 数组类型 | 无 | 声明变量为数组。 // 在元素类型后面加上[] let arr: number[] [1, 2]; // 或者使用数组泛型&#xff0c;Array<元素类型> let arr: Array [1, 2]; | | 元组…

vue与Spring boot数据交互例子【简单版】

文章目录 什么是Vue&#xff1f;快速体验Vueaxios是什么&#xff1f;向Springboot后端发送数据接收Springboot后端数据小结 什么是Vue&#xff1f; 官网解释&#xff1a;Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上…

济宁市中考报名照片要求及手机拍照采集证件照方法

随着中考报名季的到来&#xff0c;并且进入了中考报名演练阶段&#xff0c;济宁市的广大考生和家长都开始忙碌起来。报名过程中&#xff0c;上传一张符合要求的证件照是必不可少的环节。本文将详细介绍济宁市中考报名照片的具体要求&#xff0c;并提供一些实用的手机拍照采集证…

php反序列化字符串逃逸

字符串逃逸 字符串逃逸是通过改变序列化字符串的长度造成的php反序列化漏洞 一般是因为替换函数使得字符串长度发生变化&#xff0c;不论变长还是变短&#xff0c;原理都大致相同 在学习之前&#xff0c;要先了解序列化字符串的结构&#xff0c;在了解结构的基础上才能更好理解…

ubuntu22 部署fastDFS单节点和集群,整合Spring Boot(刚部署成功)

ubuntu22 部署fastDFS单节点和集群 一、先准备1、所需依赖安装2、下载安装包 二、安装FastDFS单节点1、libfastcommon安装1.1、创建软连接 2、安装fastDFS2.1、fastDFS目录简单介绍2.2、创建软连接 3、配置和启动Tracker服务3.1、修改Tracker配置文件3.2、启动Tracker 4、配置和…

DS进阶:并查集

一、并查集的原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这…

配置opencv属性表

编译opencv cmake -DCMAKE_INSTALL_PREFIX./install -G "Visual Studio 15 2017" -A x64 .. cmake -DCMAKE_INSTALL_PREFIX./install -G "Visual Studio 15 2017" -A Win32 ..cmake --build . --config Release -j 2cmake --build . --config Release --t…