poj1077 Eight

POJ1077 Eight —— 反向BFS 主页面:http://write.blog.youkuaiyun.com/postedit/77825569 代码一:以数组充当队列,利用结构体中的pre追溯上一个状态在数组(队列)中的下标: #include #include #include #include #include #include #include #include #include #incl 阅读详情

        题意:经典的八数码问题,不废话了。

        思路:BFS。搜索本身不难,难在判断节点有没有搜索过。其实这题在我刚开始搞ACM的时候用康托展开+A*这种高大上的算法刷过,这回纯粹是为了练习hash才刷的。所以写了个哈希,需要解决冲突,联想起当年上的数据结构课,这就是链表的头接法啊。


#include <iostream>         
#include <stdio.h>         
#include <cmath>         
#include <algorithm>         
#include <iomanip>         
#include <cstdlib>         
#include <string>         
#include <memory.h>         
#include <vector>         
#include <queue>         
#include <stack>         
#include <map>       
#include <set>       
#include <ctype.h>         
#define INF 1000000010     
#define ll long long     
#define max3(a,b,c) max(a,max(b,c))     
#define MAXN 1000

using namespace std;

//int start[9];
int state[1000000][9];

int head[1000003];
int next[1000000];
int pre[1000000];
char path[1000000];

int hash(int* s){
	int re=0;
	for(int i=0;i<9;i++){
		re*=10;
		re+=s[i];
	}
	return re%1000003;
}

bool insert(int s){
	int h=hash(state[s]);
	int tmp=head[h];
	
	while(tmp!=-1){
		if( memcmp(state+s,state+tmp,9*sizeof(int))==0 ){
		
			return 0;
		}
		tmp=next[tmp];
	}
	next[s]=head[h];
	head[h]=s;
	return 1;
}

void print(int x){
	if(pre[x]==-1){
		return;
	}
	print(pre[x]);
	cout<<path[x]<<" ";
}

int main(){
	memset(next,-1,sizeof(next));
	memset(head,-1,sizeof(head));
	memset(pre,-1,sizeof(pre));
	
	
	for(int i=0;i<9;i++){
		char ch;
		cin>>ch;
		if(ch=='x') state[0][i]=9;
		else state[0][i]=ch-'0';
	}
	
	insert(0);
	int rear=1;
	
	//bfs
	int end;
	bool ok=false;
	queue<int> que; que.push(0);
	while(!que.empty()){
		int cur=que.front(); que.pop();
		bool test=true;
		for(int i=0;i<9;i++){
			if(state[cur][i]!=i+1)test=false;
		}
		if(test){
			ok=true;
			end=cur;
			break;
		}
		
		int k;
		for(int i=0;i<9;i++){
			if(state[cur][i]==9)k=i;
		}
		
		if(k>2){
			memcpy(state+rear,state+cur,9*sizeof(int));
			swap(state[rear][k],state[rear][k-3]);
			if(insert(rear)){
				que.push(rear);
				pre[rear]=cur;
				path[rear]='u';
				rear++;
			}
		}
		if(k<6){
			memcpy(state+rear,state+cur,9*sizeof(int));
			swap(state[rear][k],state[rear][k+3]);
			if(insert(rear)){
				que.push(rear);
				pre[rear]=cur;
				path[rear]='d';
				rear++;
			}
		}
		
		if(k%3!=0){
			memcpy(state+rear,state+cur,9*sizeof(int));
			swap(state[rear][k],state[rear][k-1]);
			if(insert(rear)){
				que.push(rear);
				pre[rear]=cur;
				path[rear]='l';
				rear++;
			}
		}
		if(k%3!=2){
			memcpy(state+rear,state+cur,9*sizeof(int));
			swap(state[rear][k],state[rear][k+1]);
			if(insert(rear)){
				que.push(rear);
				pre[rear]=cur;
				path[rear]='r';
				rear++;
			}
		}
		
	}
	
	if(ok){
		print(end);
		cout<<endl;
	}else{
		cout<<"unsolvable"<<endl;
	}
	return 0;
}


POJ1077 Eight —— 正向BFS 主页面:http://write.blog.youkuaiyun.com/postedit/77825569 代码一:以数组充当队列,利用结构体中的pre追溯上一个状态在数组(队列)中的下标: #include #include #include #include #include #include #include #include #include #in 阅读详情

相关推荐

POJ 1077 算法

关于C++ 算法 北大网站POJ 八数码问题

[POJ]1077 Eight 八数码:康托展开+BFS

嗯~很久以前没敲过的题,当时不懂状态压缩,不懂A*。因而没过... 现在用的康托展开+普通的BFS还是过了360ms也算是一个进步吧~ A*现在还是没有勇气去写... 加油!时间给我的不多了!~ (用C++TLE了... 改为G++就过了...) Code: #include #include using namespace std; struct node { int ei

Bysen32 2919

Verilog--CDC跨时钟域处理(快时钟域到慢时钟域)

Verilog--CDC跨时钟域处理(快时钟域到慢时钟域)CDC问题单比特信号的跨时钟域问题从快时钟域到慢时钟域从慢时钟域到快时钟域多比特信号的跨时钟域问题异步FIFO握手协议 今天先写单比特信号从快时钟域到慢时钟域的方法,后续继续填坑 CDC问题 单比特信号的跨时钟域问题 从快时钟域到慢时钟域 设计思想   从慢时钟域到快时钟域通常使用打两拍的方法,这也适用于从快时钟域到慢时钟域时,但是如果当单比特信号持续时间小于快时钟域的一个周期时,需要用展宽信号再打两拍的方法。 设计相关代码 module Sync_

weixin_44425619的博客 9361

poj 1077 Eight

题目: 是一道经典的八数码问题。将一个3×3的矩阵,通过每次和四周的数字进行互换,最终达到目标状态。其中用字母“l”表示相左移动,“u”表示向上,“r”表示向右,“d”表示向下,最后结果,输出移动的字母。 样例: 目标位置是 初始位置是: 为了从初始位置到达目标位置,需要先将x与5换位置,再与6换位置,也就是先...

zjsru_Beginner的博客 574

星空组网 vs 蒲公英 vs Tailscale:2024年国内免费异地组网工具横评(含实测数据)

本文对2024年国内主流免费异地组网工具星空组网、蒲公英和Tailscale进行了深度横向评测。基于实测数据,重点分析了三者在P2P成功率、中继延迟、传输速度及稳定性方面的表现,为中小企业、远程办公及个人开发者提供了清晰的选择指南。星空组网在国内网络环境下展现出优秀的平衡性。

weixin_29217235的博客 1440

一文掌握SourceTree使用(超级详细)

SourceTree是一款开源的代码仓库客户端工具,界面美观,操作简单,具有代码克隆、本地创建、提交代码、撤销修改,拉取(pull)代码、上传(push)代码、合并分支等操作。对于软件开发人员是一款必备的应用软件。

GM_115的博客 3万+

poj 1077--Eight(八数码问题,BFS+康托展开+路径打印)

题意:经典的八数码问题,题目已确定好目标状态,若从起始状态到目标状态有解,输出最短的到达路径的每一步操作;否则输出unsolvable。 思路:这是一道经典的八数码问题,采用BFS+康托展开判重,主要多了一步打印路径,把可变化位置x看成数字0放置位置,共有9个数字,即9!种状态,在数组可开的范围内,用pre结构体记录当前状态的前驱状态即转化过来的方式,再用栈倒过来打印答案即可。(BFS时用STL中...

weixin_44756457的博客 678

学习笔记:TF卡启动荔枝派Nano(全志F1C200S)

荔枝派Nano编译Kernel报错报错内容如下编译烧录 报错内容如下 No controllers found No ethernet found. 从这些报错我真没看从出啥问题,也是在网上找,说是没有找到flash,是因为淘宝买的板子更换了flash,需要在u-boot里面重新适配型号: 板子的型号为xt25f128,但是实际u-boot的配置里面不是需要重新更改: u-boot/arch/arm/dts/suniv-f1c100s-licheepi-nano.dts &spi0 { pin

热爱科技,物联,程序开发等 2133

POJ1077 Eight —— 经典的搜索问题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 25408    Accepted Submiss

A man can be destroyed, but not defeated. 3460

【2026OD新机考】【哈希表】20260422-文章特征提取【Py/Java/C++/C/JS/Go六种语言OD真题】【欧弟算法】全网注释最详细分类最全的华子OD真题题解

90+天陪伴式学习,100+直播课时,300+动画图解视频,500+LeetCode经典题,500+华为OD真题/大厂真题,还有简历修改、模拟面试、陪伴小群、资深HR对接将为你解锁。这道题的本质是多集合交集问题的变形,属于非常典型的哈希表应用题。,储存全局的每个片段中,各个字符最少出现的次数。表示该字母并非所有片段的公共字母。,按照顺序构建答案即可。没有字母在所有三个字符串中都出现。每个字母在各字符串中都至少出现。次,所以结果中每个字母出现一次。这样,当上述循环结束后,最终。显然在上述代码中,如果字母。

weixin_48157259的博客 66

使用GitLab限制开发者使用CI/CD的权限,三种方案

使用三种方案来限制开发人员的CI/CD权限。

知无涯 5098

POJ1077 Eight A*

这个题扔到A*可也还行。。。 定义估价函数h():为每个数或空格的位置 到 最终状态中所在位置 的 曼哈顿距离 的 总和。 把状态压成一个九进制数,便于存储和判重。 然后记录方案可以记录一下此次的操作和上一次的状态,具体见代码。 安利一篇博文:http://www.cnblogs.com/goodness/archive/2010/05/04/1727141.html。。。...

137

【DRAM存储器四十六】LPDDR5介绍--基本操作之行操作、读、写

简述LPDDR5的行操作和读写时序

highman110的博客 764

POJ 1077 Eight(BFS:输出路径)

POJ 1077 Eight(BFS:输出路径) http://poj.org/problem?id=1077 题意:给你一个八数码3*3的网格,要你输出解的路径. 分析:参考刘汝佳入门经典P132.        首先对于每个网格状态,我们把它转化为一个9位的十进制数.然后用state[][9]二维数组来保存所有的我们已经发现的状态st,且用state[]来表示当前我们用的栈.

code 1467

Deepseek Engram 论文全面解读

以下是对 DeepSeek 与北京大学于联合发布的论文《》(简称Engram 论文)的。

lpfasd123的博客 356

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

POJ - 1077 Eight(A∗算法)

POJ - 1077 Eight(A∗算法) #include<iostream> #include<algorithm> #include<map> #include<queue> #define x first #define y second using namespace std; typedef pair<int,string> PIS; typedef pair<char,string> PCS; int f(

00后的博客 515

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

poj1077Eight

Eight Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 21880   Accepted: 9674   Special Judge Description The 15-puzzle has been around for over 100 years;

Min_lala的专栏 1035

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

POJ 1077 Eight

题目大意: A*:

源代码 925

POJ1077Eight

康托逆展开写错还AC的渣渣...

H992109898的博客 788
上一篇: UVa10129 Play on Words
下一篇: UVa10603 Fill
squee_spoon
博客等级 码龄14年 61粉丝 455原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值