玄学代码求调
  • 板块学术版
  • 楼主ZMQ_Ink6556
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/10 13:38
  • 上次更新2024/6/10 16:13:47
查看原帖
玄学代码求调
1125291
ZMQ_Ink6556楼主2024/6/10 13:38

加输出中间步骤可以输出正确答案,不加会卡死循环,求大佬帮忙解释:

加输出的代码:

#include<bits/stdc++.h>
using namespace std;
int a[15] , jiecheng[15] , memory[1000005] , p , vis[15] , b[15] = {0 , 1 , 2 , 3 , 8 , 0 , 4 , 7 , 6 , 5} , bx[15] , by[15];
char c;
void init()
{
	cin >> c;
	a[1] = c - '0';
	if(c == '0')
	{
		p = 1;
	}
	cin >> c;
	a[2] = c - '0';
	if(c == '0')
	{
		p = 2;
	}
	cin >> c;
	a[3] = c - '0';
	if(c == '0')
	{
		p = 3;
	}
	cin >> c;
	a[4] = c - '0';
	if(c == '0')
	{
		p = 4;
	}
	cin >> c;
	a[5] = c - '0';
	if(c == '0')
	{
		p = 5;
	}
	cin >> c;
	a[6] = c - '0';
	if(c == '0')
	{
		p = 6;
	}
	cin >> c;
	a[7] = c - '0';
	if(c == '0')
	{
		p = 7;
	}
	cin >> c;
	a[8] = c - '0';
	if(c == '0')
	{
		p = 8;
	}
	cin >> c;
	a[9] = c - '0';
	if(c == '0')
	{
		p = 8;
	}
	jiecheng[0] = 1;
	for(int i = 1 ; i <= 9 ; i++)
	{
		jiecheng[i] = jiecheng[i - 1] * i;
	}
	for(int i = 1 ; i <= 362880 ; i++)
	{
		if(i == 46686)
		{
			memory[i] = 0;
			continue;
		}
		memory[i] = -1;
	}
	for(int i = 0 ; i < 3 ; i++)
	{
		for(int j = 1 ; j <= 3 ; j++)
		{
			by[b[i * 3 + j]] = i;
			bx[b[i * 3 + j]] = j;
		}
	}
	return;
}
int kangtuo()
{
	int cnt = 0 , tmp = 0;
	for(int i = 1 ; i <= 9 ; i++)
	{
		tmp = a[i];
		for(int j = 1 ; j < i ; j++)
		{
			if(a[j] < a[i])
			{
				tmp--;
			}
		}
		cnt += tmp * jiecheng[9 - i];
	}
	return cnt + 1;
}
int far()
{
	int ax[15] , ay[15] , cnt;
	for(int i = 0 ; i < 3 ; i++)
	{
		for(int j = 1 ; j <= 3 ; j++)
		{
			ay[a[i * 3 + j]] = i;
			ax[a[i * 3 + j]] = j;
		}
	}
	for(int i = 1 ; i <= 9 ; i++)
	{
		cnt += abs(bx[i] - ax[i]) + abs(by[i] - ay[i]);
	}
	return cnt;
}
int dfs(int place)
{
	if(memory[kangtuo()] != -1)
	{
		return memory[kangtuo()];
	}
	for(int i = 1 ; i <= 9 ; i++)
	{
		cout << a[i];
	}
	cout << endl;
	int cnt = 1000000007 , farn = far();
	if(place - 1 > 0 && !vis[place - 1])
	{
		swap(a[place] , a[place - 1]);
		if(far() < farn)
		{
			cnt = min(cnt , dfs(place - 1) + 1);
		}
		swap(a[place] , a[place - 1]);
	}
	if(place - 3 > 0 && !vis[place - 3])
	{
		swap(a[place] , a[place - 3]);
		if(far() < farn)
		{
			cnt = min(cnt , dfs(place - 3) + 1);
		}
		swap(a[place] , a[place - 3]);
	}
	if(place + 1 < 10 && !vis[place + 1])
	{
		swap(a[place] , a[place + 1]);
		if(far() < farn)
		{
			cnt = min(cnt , dfs(place + 1) + 1);
		}
		swap(a[place] , a[place + 1]);
	}
	if(place + 3 < 10 && !vis[place + 3])
	{
		swap(a[place] , a[place + 3]);
		if(far() < farn)
		{
			cnt = min(cnt , dfs(place + 3) + 1);
		}
		swap(a[place] , a[place + 3]);
	}
	memory[kangtuo()] = cnt;
	return cnt; 
}
int main()
{
	ios::sync_with_stdio(0);
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	init();
	cout << dfs(p);
	return 0; 
}

不加的代码:

#include<bits/stdc++.h>
using namespace std;
int a[15] , jiecheng[15] , memory[1000005] , p , vis[15] , b[15] = {0 , 1 , 2 , 3 , 8 , 0 , 4 , 7 , 6 , 5} , bx[15] , by[15];
char c;
void init()
{
	cin >> c;
	a[1] = c - '0';
	if(c == '0')
	{
		p = 1;
	}
	cin >> c;
	a[2] = c - '0';
	if(c == '0')
	{
		p = 2;
	}
	cin >> c;
	a[3] = c - '0';
	if(c == '0')
	{
		p = 3;
	}
	cin >> c;
	a[4] = c - '0';
	if(c == '0')
	{
		p = 4;
	}
	cin >> c;
	a[5] = c - '0';
	if(c == '0')
	{
		p = 5;
	}
	cin >> c;
	a[6] = c - '0';
	if(c == '0')
	{
		p = 6;
	}
	cin >> c;
	a[7] = c - '0';
	if(c == '0')
	{
		p = 7;
	}
	cin >> c;
	a[8] = c - '0';
	if(c == '0')
	{
		p = 8;
	}
	cin >> c;
	a[9] = c - '0';
	if(c == '0')
	{
		p = 8;
	}
	jiecheng[0] = 1;
	for(int i = 1 ; i <= 9 ; i++)
	{
		jiecheng[i] = jiecheng[i - 1] * i;
	}
	for(int i = 1 ; i <= 362880 ; i++)
	{
		if(i == 46686)
		{
			memory[i] = 0;
			continue;
		}
		memory[i] = -1;
	}
	for(int i = 0 ; i < 3 ; i++)
	{
		for(int j = 1 ; j <= 3 ; j++)
		{
			by[b[i * 3 + j]] = i;
			bx[b[i * 3 + j]] = j;
		}
	}
	return;
}
int kangtuo()
{
	int cnt = 0 , tmp = 0;
	for(int i = 1 ; i <= 9 ; i++)
	{
		tmp = a[i];
		for(int j = 1 ; j < i ; j++)
		{
			if(a[j] < a[i])
			{
				tmp--;
			}
		}
		cnt += tmp * jiecheng[9 - i];
	}
	return cnt + 1;
}
int far()
{
	int ax[15] , ay[15] , cnt;
	for(int i = 0 ; i < 3 ; i++)
	{
		for(int j = 1 ; j <= 3 ; j++)
		{
			ay[a[i * 3 + j]] = i;
			ax[a[i * 3 + j]] = j;
		}
	}
	for(int i = 1 ; i <= 9 ; i++)
	{
		cnt += abs(bx[i] - ax[i]) + abs(by[i] - ay[i]);
	}
	return cnt;
}
int dfs(int place)
{
	if(memory[kangtuo()] != -1)
	{
		return memory[kangtuo()];
	}
	int cnt = 1000000007 , farn = far();
	if(place - 1 > 0 && !vis[place - 1])
	{
		swap(a[place] , a[place - 1]);
		if(far() < farn)
		{
			cnt = min(cnt , dfs(place - 1) + 1);
		}
		swap(a[place] , a[place - 1]);
	}
	if(place - 3 > 0 && !vis[place - 3])
	{
		swap(a[place] , a[place - 3]);
		if(far() < farn)
		{
			cnt = min(cnt , dfs(place - 3) + 1);
		}
		swap(a[place] , a[place - 3]);
	}
	if(place + 1 < 10 && !vis[place + 1])
	{
		swap(a[place] , a[place + 1]);
		if(far() < farn)
		{
			cnt = min(cnt , dfs(place + 1) + 1);
		}
		swap(a[place] , a[place + 1]);
	}
	if(place + 3 < 10 && !vis[place + 3])
	{
		swap(a[place] , a[place + 3]);
		if(far() < farn)
		{
			cnt = min(cnt , dfs(place + 3) + 1);
		}
		swap(a[place] , a[place + 3]);
	}
	memory[kangtuo()] = cnt;
	return cnt; 
}
int main()
{
	ios::sync_with_stdio(0);
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	init();
	cout << dfs(p);
	return 0; 
}

加的记录:here
不加的记录:here

题目:here

感谢所有帮忙的大佬

2024/6/10 13:38
加载中...