萌新求教,为什么不使用map就会RE啊?
查看原帖
萌新求教,为什么不使用map就会RE啊?
587819
gzkeylucky楼主2022/7/5 09:54

对着别人AC的代码调的QAQ

使用map就能过,不用map就RE,我不理解TAT

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=1e8+5;
long long int a[100][100];
long long int start,result=123804765;
long long int ans[5000000],vis[5000000]; 
//这里的定义改为map <int,int> ans,vis;就可以AC
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
queue <long long int> q;
void search(long long int n)
{
	q.push(n);
	q.push(result);
    if(n == result)
		{
		printf("0");
		return;
		}
    
	ans[n]=0;  
	ans[result]=1;
	vis[n]=1; vis[result]=2;
	long long int x,y,x2,y2;
	while(!q.empty())
	{
		long long int m=q.front();
		q.pop();	
		
		long long int num=m;
		for(int i=2;i>=0;--i)
		{
			for(int j=2;j>=0;--j)
			{
				a[i][j]=m%10;
				m=m/10;
				if(!a[i][j]) 
				{
				x=i; y=j;	
				}
			}
		}
	
		for(int i=0;i<4;++i)
		{
			x2=x+dx[i];
			y2=y+dy[i];
			if(x2<0||x2>2||y2<0||y2>2) continue;
			swap(a[x][y],a[x2][y2]);
			long long int res=0;
			for(int j=0;j<=2;++j)
			{
				for(int k=0;k<=2;++k)
				{
				res=res*10+a[j][k];	
				}
			}	
			if(vis[num]==vis[res])
			{
				swap(a[x][y],a[x2][y2]);
				continue;
			}
			if(vis[num]+vis[res]==3)
			{
				cout<<ans[num]+ans[res]<<endl;
				return;
			} 
						
			 ans[res]=ans[num]+1;
			 vis[res]=vis[num];
			 q.push(res);
			swap(a[x][y],a[x2][y2]);
	}
	}
	cout<<ans[result]<<endl;
}

int main()
{
	cin>>start;
	search(start);
	return 0;
}
2022/7/5 09:54
加载中...