为什么这样写会对(数据太弱了?)
查看原帖
为什么这样写会对(数据太弱了?)
554313
11111118m楼主2023/10/11 09:05
#include <bits/stdc++.h>
using namespace std;
#define ll long long
template <typename T> inline void read(T &x) {
	x = 0; int f = 1; char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') f = -1;
	for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
	x *= f;
}
const ll N = 30;
ll n, a[N], b[N], c[N], val[N], cnt, num[N];
bool vis[N], flag;
string s1, s2, s3;
void getval(ll x) {
	if (!vis[x]) {
		vis[x] = 1;
		num[cnt++] = x;
	}
}
bool check() {
	if (val[a[0]] + val[b[0]] >= n) return 1;
	for (int i = n - 1; i >= 0; --i) {
		ll fir = val[a[i]], sec = val[b[i]], thi = val[c[i]];
		if (fir == -1 || sec == -1 || thi == -1)
			continue;
		if ((fir + sec) % n != thi && (fir + sec + 1) % n != thi)
			return 1;
	}
	return 0;
}
bool verify() {
	ll rec = 0;
	for (int i = n - 1; i >= 0; --i) {
		ll fir = val[a[i]], sec = val[b[i]], thi = val[c[i]];
		if ((fir + sec + rec) % n != thi) return 1;
		rec = (fir + sec + rec) % n;
	}
	return 0;
}
void dfs(ll loc) {
	if (check() || flag) return ;
	if (loc == n) {
		if (verify()) {
			for (int i = 0; i < n; ++i)
				printf("%lld ", val[i]);
			flag = 1;
		}
		return ;
	}
	for (int i = n - 1; i >= 0; --i) {
		if (!vis[i]) {
			val[num[loc]] = i;
			vis[i] = 1;
			dfs(loc + 1);
			val[num[loc]] = -1;
			vis[i] = 0;
		}
	}
}
int main() {
	read(n);
	cin >> s1 >> s2 >> s3;
	for (int i = 0; i < n; ++i) {
		a[i] = s1[i] - 'A';
		b[i] = s2[i] - 'A';
		c[i] = s3[i] - 'A';
	}
	for (int i = n - 1; i >= 0; --i) {
		getval(a[i]);
		getval(b[i]);
		getval(c[i]);
	}
	fill(vis, vis + n, 0);
	fill(val, val + n, -1);
	dfs(0);
}

我的verity函数验证时,进位我写的(a + b + rec)% n而实际应该是 (a + b + rec) / n,之后我发现没有输出就将return的1和0的位置交换了一下就对了,但这样意思就变成了不满足条件就输出,显然不对,但这样子提交这个题就过了,为什么

2023/10/11 09:05
加载中...