关于int数组可以直接和string相互赋值的疑惑?详细见代码,悬赏五元+关
查看原帖
关于int数组可以直接和string相互赋值的疑惑?详细见代码,悬赏五元+关
1034242
RingTouSou楼主2023/10/26 16:57
#include<iostream>
#include<algorithm>
#include<string>
#include<unordered_map>
#include<queue>

using namespace std;

int g[2][4];   //存数组
unordered_map<string,int> dist;//存步数\次数
unordered_map<string,pair<char,string>> pre; 
 //存某个字符串是哪个操作,从哪里转移过来
 
queue<string> q;

void set1(string state)    //放回二维数组
{
	for(int i=0;i<4;i++)
	{
		g[0][i] = state[i];
	}
	for(int i=3,j=4;i>=0;i--,j++)
	{
		g[1][i]=state[j];
	}
}

string get1()   //二维变成一维
{
	string res;
	for(int i=0;i<4;i++)
	{
		res+=g[0][i];
	}
	for(int i=3;i>=0;i--)
	{
		res+=g[1][i];
	}
	return res;
}

string move0(string state)
{
	set1(state);
	
	for(int i=0;i<4;i++)
	{
		swap(g[0][i],g[1][i]);
	}
	
    return get1();
}

string move1(string state)
{
	set1(state);
	
	char v0=g[0][3];
	char v1=g[1][3];   //最后一列存起来
	
	for(int i=3;i>0;--i)
	{
		for(int j=0;j<2;j++)
		{
			g[j][i]=g[j][i-1];   //其他位置后移一位
		}
	}
    g[0][0]=v0;
    g[1][0]=v1;
    return get1();
}

string move2(string state)
{
	set1(state);
	
	//存左上角,然后直接转一圈
	char tmp=g[0][1];
	g[0][1]=g[1][1];
	g[1][1]=g[1][2];
	g[1][2]=g[0][2];
	g[0][2]=tmp;
    return get1();
}

int bfs(string start,string end1)
{
	q.push(start);
	dist[start]=0;
	
	while(q.size())
	{
		auto t=q.front();
		q.pop();
		
		if(t==end1)
		{
			return dist[end1];
		}
		
		string m[3];
		m[0]=move0(t);
		m[1]=move1(t);
		m[2]=move2(t);
		
		for(int i=0;i<3;i++)
		{
			string s=m[i];
			if(!dist.count(s))
			{
				dist[s] = dist[t] + 1;
				pre[s] = {char(i+'A'),t};
				if(s == end1)
				{
					return dist[end1];
				}
				q.push(s);
			}
		}  
	}
	return -1;
}

int main()
{
	int x;
	string start,end1;
	for(int i=1;i<=8;i++)
	{
		cin>>x;
		end1+=char(x+'0');
	}
	
	for(int i=1;i<=8;i++)
	{
		start += char(i+'0');
	}
	int res=bfs(start,end1);
	cout<<res<<endl;
	
	string res2;
	while(end1 != start)
	{
		res2 += pre[end1].first;
		end1 = pre[end1].second;
	}
	
	reverse(res2.begin(),res2.end());
	
	if(res2.size())
	{
		cout<<res2<<endl;
	}
	return 0;
}

在代码前部一维二维转换的地方,为什么用int也可以过?不应该加一个state【i】+‘0’这样的数字吗?加了反而WA,但是在同时,int和char数组都可以通过测试,让我感到疑惑。求求各位大佬们解答!

2023/10/26 16:57
加载中...