记录编号 117509 评测结果 AAAAAAAAAA
题目名称 [HAOI 2008]移动玩具 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 0.111 s
提交时间 2014-08-30 11:02:10 内存使用 0.31 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <map>

using namespace std;

const int INF = 256;

struct node{
	int ele[4][4];
	bool operator == (const node &a)const{
		bool flag=true;
		for(int i=0;i<4;i++)
		{
			for(int j=0;j<4;j++)
			{
				if(ele[i][j]!=a.ele[i][j])
				{
					flag=false;					
				}
			}
		}
		return flag;
	}
	bool operator < (const node &a)const{
		for(int i=0;i<4;i++)
		{
			for(int j=0;j<4;j++)
			{
				if(ele[i][j]!=a.ele[i][j])
				{
					return ele[i][j] < a.ele[i][j];				
				}
			}
		}
		return 0;
	}
	bool operator != (const node &a)const{
		return !(*this==a);
	}
}a={0},b={0};

map<node,bool> G,U;
int xx[4]={1,-1,0,0};
int yy[4]={0,0,1,-1},total=0;
char ch;

void init()
{
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<4;j++)
		{
			cin>>ch;
			if(ch=='1') a.ele[i][j]=1;
			else a.ele[i][j]=0;
		}
	}
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<4;j++)
		{
			cin>>ch;
			if(ch=='1') b.ele[i][j]=1;
			else b.ele[i][j]=0;		
		}	
	}
}

bool pass(int x,int y)
{
	return (x>=0&&x<4)&&(y>=0&&y<4);
}

void bfs()
{
	queue<int> q;
	queue<node> p;
	p.push(a), q.push(0);
	while(!q.empty())
	{
		node o=p.front(); p.pop();
		int now=q.front(); q.pop();
		if(o==b)
		{
			cout<<now<<endl;
			return;
		}
		for(int i=0;i<4;i++)
		{
			for(int j=0;j<4;j++)
			{
				if(o.ele[i][j])
				{
					for(int k=0;k<4;k++)
					{
						if(pass(i+xx[k],j+yy[k]) && !o.ele[i+xx[k]][j+yy[k]])
						{
							swap(o.ele[i+xx[k]][j+yy[k]],o.ele[i][j]);
							if(!G[o])
							{
								p.push(o);
								q.push(now+1);
								G[o]=true;
							}
							swap(o.ele[i+xx[k]][j+yy[k]],o.ele[i][j]);
						}
					}
				}
			}
		}
	}
}

int main()
{
	freopen("movea.in","r",stdin);
	freopen("movea.out","w",stdout);
	
	init();
	bfs();	
	
	return 0;
}

/*
1111
0000
1110
0010

1010
0101
1010
0101
*/