⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mobian.cpp

📁 【USACO3.2.5】魔板
💻 CPP
字号:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct node
{
	char op;
	int front;
	int num[8];
};

char flag[40321];
int index[40321];
int step[40321];
node quene[40321];
int head[8] = {1 , 2, 3 , 4, 8, 7, 6, 5};
int numtemp[7] = {5040,720,120,24,6,2,1};
int getnum[3][8] = {4 ,5 ,6 ,7 ,0 ,1 ,2 ,3, 3 ,0 ,1 ,2 ,7 ,4 ,5 ,6, 0 ,5 ,1 ,3 ,4 ,6 ,2 ,7 };


int getpos(int *p)
{
	int n,m,num;
	int count[8];
	for(n = 0 ; n < 8; n++) count[n] = n;
	for(n = 0 , num = 0; n < 7; n++)
	{
		num = num + (count[p[n]-1]) * numtemp[n];
		for(m = p[n]-1;m < 8;m++) count[m]--;
	}
	return num;
}

void getpath(int p)
{
	if(quene[p].op == '*')
		return;
	getpath(quene[p].front);
	printf("%c",quene[p].op);
}

void initBFS()
{
	int tp[8];
	node ntp;
	int count;
	int len,pos;
	int i,j,k,h;

	memset(flag,0,sizeof(char)*40321);
	len = 1;
	quene[0].op = '*';
	quene[0].front = -1;
	memcpy(quene[0].num,head,sizeof(int)*8);
	pos = getpos(quene[0].num);
	step[pos] = 0;
	flag[pos] = 1;
	
	count = 1;
	for(i = 0;i<len;count++)
	{
		h = len;
		for(;i<h;i++)
		{

			ntp = quene[i];

			for(j=0;j<3;j++)
			{
				for(k=0;k<8;k++)
				{
					quene[len].num[k] = ntp.num[getnum[j][k]];			
				}


				pos = getpos(quene[len].num);

				if(flag[pos] == 0)
				{
					flag[pos] = 1;
					index[pos] = len;
					quene[len].front = i;
					quene[len].op = j + 'A';
					step[pos] = count;
					len = len + 1;
				}
			}
		}
	}
}

int main()
{
	int i,j,p,num[8];
	initBFS();
	i = 0;
	while(scanf("%d",&num[i++])!=EOF)
	{
		if(i == 8)
		{
			j = num[7]; num[7] = num[4]; num[4] = j;
			j = num[6]; num[6] = num[5]; num[5] = j;
			p = getpos(num);
			printf("%d\n",step[p]);
			getpath(index[p]);
			printf("\n");
			i = 0;
		}
	}

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -