UVA 11212 Editing a Book

本文介绍了一个使用C++实现的复杂迷宫求解算法,通过BFS(宽度优先搜索)来寻找从起点到终点的最短路径。该算法还涉及了迷宫状态的表示、节点结构定义、队列操作及迷宫状态变换等关键步骤。

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

#include<bits/stdc++.h>
using namespace std;
int n,c[10],maxd;
struct node{
	int index;
	int tt[10];
};
void cl(queue<node>&q) {
    queue<node>emp;
    swap(emp,q);
}
queue<node>s;
void change(int i,int j,int q,int b[10]){
	int p;
	int c1[10],c2[10];
	for(p=1;p<=n;p++)
		c[p]=b[p];
	for(p=i;p<=j;p++)
		c1[p-i+1]=b[p];
	for(p=j+1;p<=q;p++)
		c2[p-j]=b[p];
	for(p=i;p<=i+q-j-1;p++)
		c[p]=c2[p-i+1];
	for(p=i+q-j;p<=q;p++)
		c[p]=c1[p-i-q+j+1];
}
int bfs(){
	int i,j,q,p;
	node l;
	while(!s.empty()){
		l=s.front();
		int d,b[10],c1[10],c2[10];
		for(i=1;i<=n;i++)
			b[i]=l.tt[i];
		d=l.index;
		s.pop();
		for(i=1;i<=n;i++)
			for(j=i;j<=n;j++)
				for(q=j+1;q<=n;q++){
					change(i,j,q,b);
					int h=0;
					for(p=1;p<=n;p++)
						if(c[p+1]!=c[p]+1&&(c[p]!=n||p!=n))h++;
					if(3*d+h<=3*maxd){
						for(p=1;p<=n;p++)
							l.tt[p]=c[p];
						l.index=d+1;
						s.push(l);
						bool ok=1;
						for(p=1;p<=n;p++)
							if(c[p]!=p){
								ok=0;
								break;
							}
						if(ok)return d+1;
					}
				}
	}
	return 0;
}
int main(){
	int i,a[10],ans,cas=0;
	while(scanf("%d",&n)){
		
		cas++;
		if(n==0)break;
		for(i=1;i<=n;i++)
			scanf("%d",&a[i]);
		bool ok=1;
		for(i=1;i<=n;i++)
			if(a[i]!=i){
				ok=0;
				break;
			}
		ans=0;
		if(ok!=1)
			for(maxd=1;maxd<=8;maxd++){
				cl(s);
				node l;
				l.index=0;
				for(i=1;i<=n;i++)
					l.tt[i]=a[i];
				s.push(l);
				int ls=bfs();
				if(ls){
					ans=ls;
					break;
				}
			}
		printf("Case %d: %d\n",cas,ans);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值