求问一个简单问题(悬关)
查看原帖
求问一个简单问题(悬关)
1268478
Depressed_楼主2024/9/17 22:11

RT,下面这份代码使用了 A* 算法。

#include <bits/stdc++.h>

#define FstIO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pb push_back
#define mem(a, v) memset(a, v, sizeof a)
#define pii pair<ll, ll>

using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
 
const ll N = 12 + 5, M = 80 + 5; 
const ll mod = 1e9 + 7, mod2 = 998244353;
const ld eps = 1e-6;

string s;

ll A[N][N], Ans[N][N] = {{1, 2, 3}, {8, 0, 4}, {7, 6, 5}};

bool chkfinal()
{
	for (ll i = 0; i < 3; ++ i ) 
		for (ll j = 0; j < 3; ++ j )
			if (A[i][j] != Ans[i][j]) return false;
	return true;
}

ll func(ll stp, ll k)
{
	ll c = 0;
	for (ll i = 0; i < 3; ++ i )
	{
		for (ll j = 0; j < 3; ++ j )
		{
			if (A[i][j] != Ans[i][j]) 
			{
				if ((++ c) + stp > k) return false;
			}
		}	
	}
		
	return true;
}

ll dx[] = {0, -1, 1, 0}, dy[] = {1, 0, 0, -1};

void A_star(ll stp, ll x, ll y, ll Rge, ll lst)
{
	if (stp == Rge)
	{
		if (chkfinal())
		{
			cout << stp << '\n';
			exit(0);
		}
		return ;
	}
	for (ll i = 0; i < 4; ++ i )
	{
		ll nx = x + dx[i], 
		   ny = y + dy[i];
		if (~nx && ~ny && nx < 3 && ny < 3 && lst + i != 3)
		{
			swap(A[x][y], A[nx][ny]); 
			if (func(stp, Rge) ) A_star(stp + 1, nx, ny, Rge, i);
			swap(A[x][y], A[nx][ny]); 
		} 
	}
}

signed main()
{
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);

	FstIO; 
	
	cin >> s; 
	for (ll i = 0; i < s.size(); ++ i ) 
	{
		A[i / 3][i % 3] = s[i] - '0';
	}
	if (chkfinal()) { cout << "0\n"; return 0; }
	
	ll c = 1, startx, starty;
	for (ll i = 0; i < 3; ++ i )
		for (ll j = 0; j < 3; ++ j )
			if (!A[i][j]) startx = i, starty = j;
			
	while (c) 
	{
		A_star(0, startx, starty, c, -114);
		++ c;
	}
	
	return 0;
	
	cout.flush();
}

为什么在 A* 里调用估价函数 func 时,参数为 stp 而不是 stp + 1。如果使用后者会 TLE,不是很理解

2024/9/17 22:11
加载中...