求分析时间复杂度
  • 板块灌水区
  • 楼主dake2010
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/11/22 21:09
  • 上次更新2023/10/27 01:54:10
查看原帖
求分析时间复杂度
655471
dake2010楼主2022/11/22 21:09
#include<bits/stdc++.h>
using namespace std;
int n=3;
queue<int>a[4][4];
queue<int>t;
int dx[]={0,1},
	dy[]={1,0};
map<long long,bool>mp;
long long make(int qqq[][4])
{
	long long qq=0,qk=1;
	for(int i=3;i>=1;i--)
	{
		for(int j=3;j>=1;j--)
		{
			qq+=qqq[i][j]*qk;
			qk*=10;
		}
	}
//	printf("%lld\n",qq);
	return qq;
}
void in(int qqq[][4])
{
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			a[i][j].push(qqq[i][j]);
		}
	}
	return;
}
void out(int qqq[][4])
{
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			qqq[i][j]=a[i][j].front();
			a[i][j].pop();
		}
	}
	return;
}
void bfs()
{
	t.push(0);
	while(!a[1][1].empty())
	{
		int b[4][4];
		out(b);
		int tt=t.front();
		if(make(b)==12345678)
		{
			printf("%d",tt);
			return;
		}
		for(int x=1;x<=3;x++)
		{
			for(int y=1;y<=3;y++)
			{
				for(int i=0;i<2;i++)
				{
					int xx=x+dx[i];
					int yy=y+dy[i];
					if(xx>=1&&yy>=1&&xx<=3&&yy<=3)
					{
						swap(b[x][y],b[xx][yy]);
						if(mp[make(b)]==0)
						{
							mp[make(b)]=1;
							in(b);
							t.push(tt+1);
						}
						swap(b[x][y],b[xx][yy]);
					}
				}
			}
		}
		t.pop();
	}
	return;
}
int main()
{
	int a[4][4];
	for(int i=1;i<=n;i++)
	{
		char ssss;
		for(int j=1;j<=n;j++)
		{
			ssss=getchar();
			a[i][j]=ssss-'0';
		}
		ssss=getchar();
	}
	in(a);
	mp[make(a)]=1;
	bfs();
	return 0;
}
2022/11/22 21:09
加载中...