POJ 1077 Eight 八数码+A* -

本文介绍使用A*搜索算法解决八数码拼图问题的方法。通过定义合适的启发式函数并利用优先队列来提高搜索效率,实现了从任意初始状态找到解决拼图的最优路径。此外还介绍了如何通过奇偶性判断解决方案的存在性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址:http://poj.org/problem?id=1077

先根据奇偶性判断能否达到

然后A*算法

注意:open表里根据h的值能效率更快,因为类似无障碍的图,离终点最近就应该最先pop

更新的时候不用检查closed表和open表,所以直接优先队列+判重就好了

#include<iostream>
#include<cstdio>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
struct Node{
	int status;
	int f,g,h;
	int parent;
	int move;
	Node(int s,int g,int h,int p,int m):status(s),f(g+h),g(g),h(h),parent(p),move(m){}
	bool operator < (const Node& n) const {
		return h>n.h;  //比较h比比较f效率更高 
	}
};
int toInt(int *A)
{
	int x=0;
	for(int i=0;i<9;i++)
	x=x*10+A[i];
	return x;
}
int toIntArray(int A[],int s)
{
	int p;
	for(int i=8;i>=0;i--)
	{
		A[i]=s%10;
		if(!A[i]) p=i;
		s/=10;
	}
	return p;
}
int h(int status)
{
	int cnt=0;
	int a[9];
	toIntArray(a,status); 
	for(int i=0;i<3;i++)
	for(int j=0;j<3;j++)
	{
		int n=a[i*3+j]-1;
		int x=n/3,y=n%3;
		if(n==-1) x=y=2;
		cnt+=abs(x-i)+abs(y-j);
	}
	return cnt;
}
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
bool inside(int x,int y){
	return x>=0&&x<3&&y>=0&&y<3;
}
int move(int s,int i)
{
	int b[9];
	int p=toIntArray(b,s);
	int x=p/3,y=p%3;
	int nx=x+dx[i],ny=y+dy[i];;
	if(!inside(nx,ny)) return -1;
	int np=nx*3+ny;
	swap(b[np],b[p]);
	int ns=toInt(b);
	return ns;
}
priority_queue<Node> open; 
vector<Node> closed;
map<int,int> inClosed;
void inline AddClosed(Node v){
	closed.push_back(v);
	inClosed[v.status]=closed.size()-1;
}
void A_Star(int s,int t)
{
	open.push(Node(s,0,h(s),-1,0));
	while(!open.empty())
	{
		Node u=open.top(); open.pop();
		AddClosed(u);
		int s=u.status;
		if(s==t) return ;
		for(int i=0;i<4;i++)
		{
			int ns=move(s,i);
			if(ns==-1||inClosed.count(ns)) continue;
			Node v=Node(ns,u.g+1,h(ns),s,i);  //不用检查是否在open表里,因为f大的出不来 
			open.push(v);
		}
	} 
}
bool bSolved(int s){  //根据奇偶性,预判是否可以解决 
	int cnt=0,a[9];
	toIntArray(a,s);
	for(int i=0;i<9;i++)
	{
		if(!a[i]) continue;
		for(int j=i+1;j<9;j++)
		{
			if(!a[j]) continue;
			if(a[i]>a[j]) cnt++;
		}
	}
	return cnt&1;
}
int main()
{
	int a[10];char ch;
	for(int i=0;i<9;i++) {
		cin>>ch;
		if(isdigit(ch)) a[i]=ch-'0';
		else a[i]=0;
	}
	int s=toInt(a),t=123456780;
	if(bSolved(s)){
		cout<<"unsolvable"; return 0;
	}
	A_Star(s,t);
	char d[5]="udlr";
	vector<char> ans;
	for(Node i=closed[inClosed[t]];i.parent!=-1;i=closed[inClosed[i.parent]])
	ans.push_back(d[i.move]);
	for(int i=ans.size()-1;i>=0;i--) cout<<ans[i];
	return 0;
}


内容概要:本文详细探讨了杯形谐波减速器的齿廓修形方法及寿命预测分析。文章首先介绍了针对柔轮与波发生器装配时出现的啮合干涉问题,提出了一种柔轮齿廓修形方法。通过有限元法装配仿真确定修形量,并对修形后的柔轮进行装配运转有限元分析。基于Miner线性疲劳理论,使用Fe-safe软件预测柔轮寿命。结果显示,修形后柔轮装配最大应力从962.2 MPa降至532.7 MPa,负载运转应力为609.9 MPa,解决了啮合干涉问题,柔轮寿命循环次数达到4.28×10⁶次。此外,文中还提供了详细的Python代码实现及ANSYS APDL脚本,用于柔轮变形分析、齿廓修形设计、有限元验证疲劳寿命预测。 适合人群:机械工程领域的研究人员、工程师,尤其是从事精密传动系统设计分析的专业人士。 使用场景及目标:①解决杯形谐波减速器中柔轮与波发生器装配时的啮合干涉问题;②通过优化齿廓修形提高柔轮的力学性能使用寿命;③利用有限元分析疲劳寿命预测技术评估修形效果,确保设计方案的可靠性可行性。 阅读建议:本文涉及大量有限元分析疲劳寿命预测的具体实现细节,建议读者具备一定的机械工程基础知识有限元分析经验。同时,读者可以通过提供的Python代码ANSYS APDL脚本进行实际操作验证,加深对修形方法技术路线的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值