P2578

[ZJOI2005]九数码游戏

题目描述

输入格式

输入文件中包含三行三列九个数,同行的相邻两数用空格隔开,表示初始状态每个方格上的数字。初始状态不会是目标状态。

输出格式

如果目标状态无法达到,则输出“UNSOLVABLE”(引号不输出)。

否则,第一行是一个整数S,表示最少的操作次数。接下来4 × (S + 1)行,每四行表示一个状态:前三行每行三个整数,相邻两数用空格隔开,表示每个方格上的数字,第四行是一个空行,作为分隔。第一个状态必须是初始状态,最后一个状态必须是目标状态。

样例 #1

样例输入 #1

2 3 0
1 8 7
5 4 6

样例输出 #1

4
2 3 0
1 8 7
5 4 6

1 2 3
5 8 0
4 6 7

1 2 3
0 5 8
4 6 7

0 1 2
4 5 3
6 7 8

0 1 2
3 4 5
6 7 8

一言难尽

这个题若按正常BFS手写q的话空间要炸
所以说只能queue<> ……
然后还要开O2才能卡过 只能说人都调麻了

警示!

点击查看代码
#include<bits/stdc++.h>
using namespace std;
string start,target;
const int mod=100007;
struct did{
	int c;
	string s="";
	string now;
}z;
queue<did>q;
map<string,int>pd;
void bfs()
{
	pd[start]=1;
	while(!q.empty())
	{
		string a,b;
		did s=q.front();q.pop();
		a=s.now;
		if(a==target)
		{
			cout<<s.c<<"\n";
			for(int i=1;i<=s.s.size()/9;i++)
			{
				string ss=s.s;
				cout<<ss[0+(i-1)*9]<<" "<<ss[1+(i-1)*9]<<" "<<ss[2+(i-1)*9]<<"\n";
				cout<<ss[3+(i-1)*9]<<" "<<ss[4+(i-1)*9]<<" "<<ss[5+(i-1)*9]<<"\n";
				cout<<ss[6+(i-1)*9]<<" "<<ss[7+(i-1)*9]<<" "<<ss[8+(i-1)*9]<<"\n";
				cout<<"\n";
			}
			exit(0);
		}
		b=a;int pos;
			b=a;
			b[0]=a[3],b[1]=a[0],b[2]=a[1];
			b[3]=a[6],b[4]=a[4],b[5]=a[2];
			b[6]=a[7],b[7]=a[8],b[8]=a[5];
			if(!pd[b])
			{
				z.c=s.c+1,z.s=s.s+b,z.now=b;
				q.push(z);
				pd[b]=1;
			}
			b=a;
			b[3]=a[5],b[4]=a[3],b[5]=a[4];
			if(!pd[b])
			{
				z.c=s.c+1,z.s=s.s+b,z.now=b;
				q.push(z);
				pd[b]=1;
			}
		
	}
}
int main()
{
	ios::sync_with_stdio(false);
	for(int i=1;i<=9;i++)
	{
		int x;
		cin>>x;
		start+=char(int('0')+x);
	}
	z.c=0,z.now=start,z.s=start;
	q.push(z);
	target="012345678";
	bfs();
	cout<<"UNSOLVABLE\n";
	return 0;
}
posted @ 2023-01-08 16:32  PKU_IMCOMING  阅读(15)  评论(0)    收藏  举报