纯搜索,无优化!
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 10 using namespace std; int n, m, f; int c[300], b[N]; string map[N][N]; bool check() { int i, j, k, x; for(i = 1; i < n; i++) for(j = 1; j < n; j++) { x = 0; for(k = 0; k < map[i][j].length(); k++) x = x * m + c[map[i][j][k]]; if(x != c[map[0][j][0]] + c[map[i][0][0]]) return 0; } return 1; } inline void dfs(int k) { if(k == n) { if(check()) { for(int i = 1; i < n; i++) cout << map[0][i][0] << "=" << c[map[0][i][0]] << " "; cout << endl << m << endl; exit(0); } } for(int i = 0; i < m; i++) if(!b[i]) { b[i] = 1; c[map[0][k][0]] = i; dfs(k + 1); b[i] = 0; } } int main() { int i, j; cin >> n; for(i = 0; i < n; i++) for(j = 0; j < n; j++) cin >> map[i][j]; for(m = n - 1; m <= 10; m++) { memset(b, 0, sizeof(b)); dfs(1); } cout << "ERROR! "; return 0; }