首页 > 其他分享 >题解 UVA1343 The Rotation Game

题解 UVA1343 The Rotation Game

时间:2022-09-01 15:36:01浏览次数:64  
标签:格子 16 int 题解 18 Game text inline Rotation

题解区都是 \(\text{IDA*}\),实际上这题 \(\text{A*}\) 也可以,代码也很简单。

Solution

首先由于整个棋盘的形状是已知的,所以我们可以先处理出 \(\text{A~H}\) 操作对应行列的格子编号及中间 \(8\) 个格子的编号,使代码实现简单化。

而对于 \(\text{A*}\),最重要的就是估价函数 \(f(x)=g(x)+h(x)\),那么我们可以把每一个棋盘状态 \(x\) 的操作次数当作 \(g(x)\),然后把中间 \(8\) 个格子中还需要修改的格子数当作估计的 \(h(x)\),最后以 \(f(x)\) 为序来进行广搜即可。

因为棋盘上只有 \(24\) 个格子,目标状态也是一定能达到的,且时限放到了 \(3s\),\(\text{A*}\) 算法足以通过此题。

Code

实现非常清晰,加上提前处理的编号也只有 \(50\) 多行

#include<bits/stdc++.h>
using namespace std;
const int p[]={7,8,9,12,13,16,17,18},//中心格子
li[][8]={{1,3,7,12,16,21,23},//A~H操作
		{2,4,9,13,18,22,24},
		{11,10,9,8,7,6,5},
		{20,19,18,17,16,15,14},
		{24,22,18,13,9,4,2},
		{23,21,16,12,7,3,1},
		{14,15,16,17,18,19,20},
		{5,6,7,8,9,10,11}};
struct node{
	int step,f,a[25];
	vector<int>op;//记录每次操作
	inline void init(){step=0;op.clear();}
	inline int h(){//计算需修改的格子数
		int c[4]={0,0,0,0};
		for(int x:p)c[a[x]]++;
		return 8-*max_element(c+1,c+4);
	}inline void calcf(){f=step+h();}
	bool operator<(node x)const{return f==x.f?op>x.op:f>x.f;}
	inline void move(int x){//进行修改操作
		int tmp=a[li[x][0]];
		for(int i=0;i<6;i++)a[li[x][i]]=a[li[x][i+1]];
		a[li[x][6]]=tmp;
	}
}st;
void Astar(){
	st.init();
	st.calcf();
	if(!st.h()){
		printf("No moves needed\n%d\n",st.a[p[0]]);
		return;
	}
	priority_queue<node>q;
	q.push(st);
	while(!q.empty()){
		node u=q.top();q.pop();
		for(int i=0;i<8;i++){
			node v=u;
			v.move(i);v.calcf();
			v.op.push_back(i);
			v.step++;
			if(!v.h()){//v为目标状态,直接输出
				for(int x:v.op)putchar('A'+x);
				printf("\n%d\n",v.a[p[0]]);
				return;
			}q.push(v);
		}
	}
}
int main(){
	while(~scanf("%d",&st.a[1])){
		if(!st.a[1])break;
		for(int i=2;i<=24;i++)scanf("%d",&st.a[i]);
		Astar();
	}
	return 0;
}

标签:格子,16,int,题解,18,Game,text,inline,Rotation
From: https://www.cnblogs.com/aday526/p/solution-uva1343.html

相关文章

  • CF1722G 题解
    题目构造一个长度为\(n\)的数列,数列中每个数各不相同且都不超过\(2^{31}\),使得奇数项和偶数项的异或和相等。思路我提供一种比较神奇的构造方法。首先,两个数相等可......
  • CF351B Jeff and Furik 题解
    CF351BJeffandFurik有一个长度为n的排列p,Jeff每次操作选两个相邻元素交换,Furik每次操作随机执行下列操作之一:1.对于所有p[i]<p[i+1],随机取一对p[i]与p[i+1]交换2.......
  • onenote突然无法同步,同步报错以及创建笔记本都报错问题解决
    同步报错:OneNote当前无法同步笔记。将继续尝试。(错误代码:0x80004005bdf5j)创建笔记本报错:OneNote无法在以下位置新建笔记本打开笔记本报错:无法打开笔记本无法打开......
  • hzx的CSP-J模拟赛题解
    T1按题意模拟即可,注意不用考虑闰年。T2\(30\%\)的数据:使用\(Floyd\)求出图的全源最短路,时间复杂度\(O(n^3)\)。\(50\%\)的数据:对图上每个点使用\(Dijkstra\)求......
  • P1004 [NOIP2000 提高组] 方格取数 题解
    [NOIP2000提高组]方格取数题目描述设有\(N\timesN\)的方格图\((N\le9)\),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字\(0\)。如下图所示(见样例):......
  • iOS自动化真机测试验证环境过程中常见问题解析
    ⬇️点击“下方链接”,提升测试核心竞争力!>>更多技术文章分享和免费资料领取本章节主要讲解iOS自动化真机配置以及在iOS真机执行自动化时常见问题与解决方法。真机使......
  • LG3565 [POI2014]HOT-Hotels 题解
    P3565[POI2014]HOT-Hotels给定一棵树,在树上选\(3\)个点,要求两两距离相等,求方案数。原题数据范围\(n\leq5000\),可做到线性,空间\(62.5\text{MB}\)。sub1\(n\leq......
  • vue中render中src不生效问题解决
    在vue文件中写html代码的话可以直接用<imgsrc="xxx"/>但是在render中就不能正常工作。原理度娘上有,那render中要使用的话需要加requirerender<imgsrc={required(......
  • luoguP8085 [COCI2011-2012#4] KRIPTOGRAM 题解(KMP)
    /*给定明文和密文,密文与明文的某个字串格式相同,找出密文出现的最早位置。如:明文aaabcdabc 密文xy ans:3解:容易想到KMP算法。可以发现,密文和对应子串的格式相同......
  • 题解 AT5635 Shortest Path on a Line(线段树优化建图)
    题解AT5635ShortestPathonaLineDescription题目传送门题面翻译有一张有\(N\)个点,编号为\(1-N\)的无向图。做\(M\)次操作,每次操作给出三个正整数\(L,R,......