暴力枚举求调悬关
查看原帖
暴力枚举求调悬关
809729
SJZ2010楼主2023/9/2 15:00

#3 和 #4 WA 了,原因是 ERROR! 判断错了。

但是不知道错在哪,希望各位大佬指出。/bx

#include <algorithm>
#include <iostream>
#include <string>
#include <map>

int n, num[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::string str[15][15];
std::map< std::string, int > mp;//存字母对应数字

inline int toint(std::string s) {//字符串转 int
	int res(0);
	for (register int i(0); i < s.size(); i++){
		std::string temp = "";
		temp += s[i];
		res = res*(n-1) + mp[temp];
	}
	return res;
}

inline bool check() {//判断方案是否可行
	register int i, j;
	for (i = 2; i <= n; i++)
		for (j = 2; j <= n; j++) {
			int stoi = toint(str[i][j]);
			if (stoi != mp[str[1][i]] + mp[str[j][1]])
				return false;
		}
	return true;
}

int main() {
	std::ios::sync_with_stdio(0);
	std::cout.tie(0);
	std::cin.tie(0);
	std::cin >> n;
	register int i, j;
	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++)
			std::cin >> str[i][j];

	do {
		for (i = 0; i < n-1; i++)//赋值
			mp[str[1][i+2]] = num[i];
		if (check()) {
			for (i = 2; i <= n; i++)
				std::cout << str[1][i] << '=' << mp[str[1][i]] << ' ';
			std::cout << '\n';
			std::cout << n-1;
			return 0;
		}
	} while(std::next_permutation(num, num+n-2));
	for (i = 0; i < n-1; i++)//发现 next … 函数不会运行到完全倒叙,再来一下
		mp[str[1][i+2]] = n-2-i;
	if (check()) {
		for (i = 2; i <= n; i++)
			std::cout << str[1][i] << '=' << mp[str[1][i]] << ' ';
		std::cout << '\n';
		std::cout << n-1;
		return 0;
	}
	std::cout << "ERROR!\n";//全不行,ERROR
	return 0;
}
2023/9/2 15:00
加载中...