求助:Cantor展开判重直接爆MLE
查看原帖
求助:Cantor展开判重直接爆MLE
372299
超级玛丽王子楼主2020/9/17 19:50
#include <bits/stdc++.h>
using namespace std;
const int LEN=362880;
using namespace std;
struct node {
	int state[9];
	int dis;
}; 
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
int visited[LEN]={0},start[9],goal[9];
long int factory[]={1,1,2,6,24,120,720,5040,40320,362880};   
inline bool Cantor(int str[], int n) {
	long result=0;
	for(int i=0;i<n;i++) {
		int counted=0;
		for(int j=i+1;j<n;j++) if(str[i]>str[j]) ++counted;
		result+=counted*factory[n-i-1];
	}
	if(!visited[result]) {
		visited[result]=1;
		return 1;
	}
	return 0;
}
inline int bfs() {
	node head;
	memcpy(head.state,start,sizeof(head.state));
	head.dis=0;
	queue<node>q;
	Cantor(head.state,9);
	q.push(head);
	while(!q.empty()) {
		head=q.front();
		q.pop();
		int z;
		for(z=0;z<9;z++) {
			if(head.state[z]==0) break;
		}
		int x=z%3,y=z/3;
		for(int i=0;i<4;i++) {
			int newx=x+dir[i][0],newy=y+dir[i][1];
			int nz=newx+3*newy;
			if(newx>=0&&newx<3&&newy>=0&&newy<3) {
				node newnode;
				memcpy(&newnode,&head,sizeof(struct node));
				swap(newnode.state[z],newnode.state[nz]);
				newnode.dis++;
				if(memcmp(newnode.state,goal,sizeof(goal))==0) return newnode.dis;
				if(Cantor(newnode.state,9)); q.push(newnode);
			}
		}
	}
	return -1;
}
int main() {
	for(int i=0;i<9;i++) scanf("%d",start+i);
	for(int i=0;i<9;i++) scanf("%d",goal+i);
	int num=bfs();
	if(num!=-1) printf("%d\n",num);
	return 0;
}

感觉数组并不大啊QAQ

2020/9/17 19:50
加载中...