记录编号 108736 评测结果 AAAAAAAAAA
题目名称 [NOI 2001]聪明的打字员 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 7.749 s
提交时间 2014-07-05 23:06:52 内存使用 6.04 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
class STATE{
public:
	int a[6],cur;
	int tim;
	void print(void){
		cout<<cur<<" ";
		for(int i=0;i<6;i++) cout<<a[i]<<" ";cout<<endl;
	}
};
STATE turnstate(string s){
	STATE ans;
	for(int i=0;i<6;i++) ans.a[i]=s[i]-'0';
	return ans;
}
//分别对应:swap0,swap1,up,down,left,right
STATE operate(STATE s,int cmd){
	if(cmd==0){swap(s.a[s.cur],s.a[0]);}
	else if(cmd==1){swap(s.a[s.cur],s.a[5]);}
	else if(cmd==2){if(s.a[s.cur]<9) s.a[s.cur]++;}
	else if(cmd==3){if(s.a[s.cur]>0) s.a[s.cur]--;}
	else if(cmd==4){if(s.cur>0) s.cur--;}
	else if(cmd==5){if(s.cur<5) s.cur++;}
	return s;
}
bool operator == (STATE s,STATE t){
	for(int i=0;i<6;i++) if(s.a[i]!=t.a[i]) return false;
	return true;
}
STATE start,goal;
bool vis[6][10][10][10][10][10][10]={0};
bool checkvis(STATE s){//如果之前未被访问过则把相应vis标记
	bool &v=vis[s.cur][s.a[0]][s.a[1]][s.a[2]][s.a[3]][s.a[4]][s.a[5]];
	if(!v) return v=true;
	return false;
}
queue<STATE> Q;
void BFS(void){
	if(start==goal){
		printf("0\n");
		return;
	}
	start.tim=0;
	start.cur=0;
	checkvis(start);
	Q.push(start);
	STATE s,t;
	while(true){
		s=Q.front();Q.pop();
		for(int i=0;i<6;i++){
			t=operate(s,i);
			if(checkvis(t)){
				t.tim=s.tim+1;
				Q.push(t);
				if(t==goal){
					printf("%d\n",t.tim);
					return;
				}
			}
		}
	}
}
void read(void){
	string str;
	cin>>str;
	start=turnstate(str);
	cin>>str;
	goal=turnstate(str);
}
int main(){
	freopen("clever.in","r",stdin);
	freopen("clever.out","w",stdout);
	read();
	BFS();
	return 0;
}