#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;
}