求助,第十二个点WA
查看原帖
求助,第十二个点WA
578932
AlphaGuo楼主2022/6/6 13:49
#include<set>
#include<queue>
#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

int dx[4]{0,0,-1,1},dy[4]{-1,1,0,0};

struct matrix
{
	int board[3][3];
	bool friend operator<(matrix a,matrix b)
	{
		for(int i=0;i<3;i++)
			for(int j=0;j<3;j++)
				if(a.board[i][j]!=b.board[i][j])
					return a.board[i][j]<b.board[i][j];
		return false;
	}
};

matrix st,target;

int H(matrix a)
{
	int ans{};
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
			if(a.board[i][j]!=target.board[i][j])ans++;
	return ans;
}

struct node
{
	 int time;matrix status;
	 bool friend operator<(node a,node b){return H(a.status)+a.time>H(b.status)+b.time;}
};

set<matrix>vis;
priority_queue<node>q;

inline bool check(int a,int b){return (a>=0&&a<3&&b>=0&&b<3);}

int main()
{
	target.board[0][0]=1,target.board[0][1]=2,target.board[0][2]=3;
	target.board[1][0]=8,target.board[1][1]=0,target.board[1][2]=4;
	target.board[2][0]=7,target.board[2][1]=6,target.board[2][2]=5;
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
			{
				char ch=getchar();
				st.board[i][j]=ch-'0';
			}
	q.push(node{0,st}),vis.insert(st);
	
	while(!q.empty())
	{
		node now=q.top();q.pop();
		if(!H(now.status)){cout<<now.time<<endl;break;}
		//for(int i=0;i<3;i++,cout<<endl)for(int j=0;j<3;j++)cout<<now.status.board[i][j];cout<<endl;

		for(int i=0;i<3;i++)
			for(int j=0;j<3;j++)
				for(int k=0;k<4;k++)
					{
						int xx=i+dx[k],yy=j+dy[k];
						if(check(xx,yy)&&(now.status.board[xx][yy]==0))
						{
							swap(now.status.board[i][j],now.status.board[xx][yy]);
							//for(int i=0;i<3;i++,cout<<endl)for(int j=0;j<3;j++)cout<<now.status.board[i][j];cout<<endl;
							if(!vis.count(now.status))
								q.push(node{now.time+1,now.status}),vis.insert(now.status);
							swap(now.status.board[i][j],now.status.board[xx][yy]);
							//for(int i=0;i<3;i++,cout<<endl)for(int j=0;j<3;j++)cout<<now.status.board[i][j];cout<<endl;
						}
					}
	}
}
//第十二个点数据:201534786
2022/6/6 13:49
加载中...