后三个点TLE,求调
查看原帖
后三个点TLE,求调
816204
Light_LE楼主2025/8/3 21:10
#include <bits/stdc++.h>
#define maxn 100003
using namespace std;
struct Data {
	int x, step;
};
int s, m, n;
int vis[maxn];
queue<Data> q;
int main() {
	//freopen(".in", "r", stdin); 
	//freopen(".out", "w", stdout);
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

	cin >> s >> m;
	int _tmp = s;
	while (_tmp) {// 统计原数字数位 
		_tmp /= 10;
		n++;
	}
	while(m--) {
		memset(vis, 0, sizeof(vis));
		while (q.size()) q.pop();
		
		int t, flag = 0;
		cin >> t;
		
		q.push((Data){s, 0});
		while (q.size()) {
			Data f = q.front(); q.pop();
			int x = f.x;
			
			if (x == t) {
				cout << f.step << '\n';
				flag = 1;
				break;
			}
			if (vis[x]) continue;
			vis[x] = 1;
			
			// 拆分为数组 
			int a[10] = {0};// 倒序 
			int len = 0;
			while(x) {
				a[++len] = x % 10;
				x /= 10;
			}
			if (len == 1) continue;
			
			// swap
			for (int i = 1; i <= len; i++) {
				for (int j = i + 1; j <= len; j++) {
					swap(a[i], a[j]);
					// 还原为数字
					int tmp = 0;
					for (int k = len; k >= 1; k--) {
						tmp = tmp * 10 + a[k];
					}
					q.push((Data){tmp, f.step + 1});
					swap(a[i], a[j]);
				}
			}
			
			// remove
			for (int i = 1; i <= len; i++) {
				// 还原为数字 
				int tmp = 0;
				for (int j = len; j >= 1; j--) {
					if (i == j) continue;// skip
					tmp = tmp * 10 + a[j];
				}
				q.push((Data){tmp, f.step + 1});
			}
			
			// insert
			if (len == n) continue;
			for (int i = 1; i <= len - 1; i++) {
				for (int k = a[i + 1] + 1; k < a[i]; k++) {
					// 还原为数字
					int tmp = 0;
					for (int j = len; j > i; j--) {
						tmp = tmp * 10 + a[j];
					}
					tmp = tmp * 10 + k;
					for (int j = i; j >= 1; j--) {
						tmp = tmp * 10 + a[j];
					}
					q.push((Data){tmp, f.step + 1});
				}
			}
		}
		if (flag == 0) {
			cout << -1 << '\n';
		}
	}
	return 0;
}
2025/8/3 21:10
加载中...