USACO3.2 Magic Squares(square)

        BFS+多维数组判重,状态数为8!。输出其实根本不用判断60个字符一行,因为BFS到22层就已经有了40316左右中情况,接近全部的40320。所以即使再强的数据也不会到达60步。程序仿的,这个题不是很会。

 

/*
ID:jzzlee1
PROB:msquare
LANG:C++
*/
//#include<iostream>
#include<fstream>
#include<cstring>
#include<queue>
#include<string>
using namespace std;
ifstream cin("msquare.in");
ofstream cout("msquare.out");
short r[3][5];  //目标状态
short a[3][5];  //初始状态
short tmp;
bool  vis[9][9][9][9][9][9][9]; //判重
struct  node     //代表每种状态的类型
{
	int dep;     //当前的操作序列的长度
	string str;  //当前的操作序列
	short b[3][5];//当前的状态
}q[50000];        //BFS时用到的队列 最多40320种状态,每种状态只访问一次 
int head,tail;
void input()
{
	for(int j=1; j<=4; j++)
		cin>>r[1][j];
	for(int i=4; i>=1; i--)
		cin>>r[2][i];
	for(int i=1; i<=4; i++)
	{
		a[1][i] = i;
		a[2][i] = 8-i+1;
	}
}
inline void A(short (*b)[5])    //操作A
{
	for(int i=1; i<=4; i++)
	{
		tmp = b[1][i];
		b[1][i] = b[2][i];
		b[2][i] = tmp;
	}
}
inline void B(short (*b)[5])
{
	b[1][0] = b[1][4];
	b[2][0] = b[2][4];
	for(int i=4; i>=1; i--)
	{
		b[1][i] = b[1][i-1];
		b[2][i] = b[2][i-1];
	}
}
inline void C(short (*b)[5])
{
	tmp = b[1][3];
	b[1][3] = b[1][2];
	b[1][2] = b[2][2];
	b[2][2] = b[2][3];
	b[2][3] = tmp;
}
inline bool isequal(short (*r)[5],short (*b)[5])
{
	for(int i=1; i<=2; i++)
		for(int j=1; j<=4; j++)
			if(r[i][j]!=b[i][j])
				return false;
	return true;
}
void BFS()
{
	memset(vis,0,sizeof(vis));
	//初始化队首元素
	memcpy(q[0].b,a,sizeof(a));
	q[0].dep=0;
	q[0].str = "";
	head = 0;
	tail = 1;
	vis[q[0].b[1][1]][q[0].b[1][2]][q[0].b[1][3]][q[0].b[1][4]][q[0].b[2][1]][q[0].b[2][2]][q[0].b[2][3]] = 1;
	node next;
	node p;
	while(1)
	{
		p = q[head];
		head++;
		head%=50000;
		if(isequal(r,p.b))
		{
			cout<<p.dep<<endl;
			cout<<p.str<<endl;
			break;
		}
		//A
		next = p;
		next.dep = p.dep+1;
		next.str = p.str+"A"; 
		A(next.b);
		if(!vis[next.b[1][1]][next.b[1][2]][next.b[1][3]][next.b[1][4]][next.b[2][1]][next.b[2][2]][next.b[2][3]])
		{
			q[tail] = next;
			tail++;
			tail%=50000;
			vis[next.b[1][1]][next.b[1][2]][next.b[1][3]][next.b[1][4]][next.b[2][1]][next.b[2][2]][next.b[2][3]] = 1;
		}
		//B
		next = p;
		next.dep = p.dep+1;
		next.str = p.str+"B"; 
		B(next.b);
		if(!vis[next.b[1][1]][next.b[1][2]][next.b[1][3]][next.b[1][4]][next.b[2][1]][next.b[2][2]][next.b[2][3]])
		{
			q[tail] = next;
			tail++;
			tail%=50000;
			vis[next.b[1][1]][next.b[1][2]][next.b[1][3]][next.b[1][4]][next.b[2][1]][next.b[2][2]][next.b[2][3]] = 1;
		}
		//C
		next = p;
		next.dep = p.dep+1;
		next.str = p.str+"C";
		C(next.b);
		if(!vis[next.b[1][1]][next.b[1][2]][next.b[1][3]][next.b[1][4]][next.b[2][1]][next.b[2][2]][next.b[2][3]])
		{
			q[tail] = next;
			tail++;
			tail%=50000;
			vis[next.b[1][1]][next.b[1][2]][next.b[1][3]][next.b[1][4]][next.b[2][1]][next.b[2][2]][next.b[2][3]] = 1;
		}
	}
}
int main()
{
	input();
	BFS();
	return 0;
}

你可能感兴趣的:(USACO)