蓝桥杯 历届试题 九宫重排

参考:http://blog.csdn.net/u010372095/article/details/20077681 

#include <iostream> 
#include <queue>
#include <cstring>
#include <string> 
using namespace std; 

#define MAX 10   
#define MAXK 9 
#define MAXC 400000 
#define MAXD 4

int fac[9]={1,1,2,6,24,120,720,5040,40320};    
int dir[4][2]={-1,0,1,0,0,-1,0,1}; //上下左右四个方向交换  

struct node{
	int loc,c[MAX],step; 
}; 

void trans(int a[],string b)
{
	for (int i=0;i<MAXK;i++) 
	{ 
		if (b[i]>='1'&&b[i]<='8')
		{ 
			a[i]=b[i]-'0'; 
		} else {
			a[i]=9;  
		}
	}
} 
//康托展开
int cantuo(int s[],int e)  
{  
	int i,j,temp,num=0;   
	for (i=0;i<e;i++)  
	{   
		temp=0;   
		for (j=i+1;j<=e;j++)   
		{   
			if (s[j]<s[i])  
			{  
				temp++;   
			}   
		}  
		num+=fac[e-i]*temp;   
	}   
	return num+1;   
}


int find(int c[],int num1,int num2)
{ 
	if (num1==num2) return 0; 
	queue<node>q; 
	node now,next; 
	bool vis[MAXC];
	memset(vis,0,sizeof(vis)); 

	for (int i=0;i<MAXK;i++)
	{ 
		if (c[i]==9)
			now.loc=i; 
		now.c[i]=c[i]; 
	} 
	now.step=0; 

	vis[num1]=true;  
	q.push(now); 

	while(!q.empty()){
		now=q.front(); q.pop();  
		for (int d=0;d<MAXD;d++) 
		{
			int x=now.loc/3+dir[d][0]; 
			int y=now.loc%3+dir[d][1];  
			if (x>=0&&y>=0&&x<3&&y<3) 
			{ 
				next=now;  
				next.loc=3*x+y; 
				next.step++;         
				next.c[next.loc]=9; 
				next.c[now.loc]=now.c[next.loc]; 
				int num=cantuo(next.c,8);   
				if (num==num2) return next.step; 
				if (!vis[num])
				{
					vis[num]=!vis[num]; 
					q.push(next);  
				}
			} 
		}
	}
	return -1; 
} 

int main()
{
	string bc,ac; 
	int c[MAX],tc[MAX];  
	int num1,num2;  
	while(cin>>bc>>ac){ 
		trans(c,bc); 
		trans(tc,ac); 
		num1=cantuo(c,8); 
		num2=cantuo(tc,8);
		cout<<find(c,num1,num2); 
	}
	return 0; 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值