【洛谷 1013】 进制位
来源:互联网 发布:开淘宝零食店 编辑:程序博客网 时间:2024/05/24 06:45
思路
我直接暴力枚举可能的值,每一位计算,然而洛谷的数据是错的。。。
其实好有更好的做法,在一个加法表里,字母出现的次数是多少,减一就是对应的值,只算出现一次的。
代码
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;char a1[15][15][15], b1[15], cnt;int ans[15], n, is[15], map [300];bool vis[15];bool check(){ int num1[15], pp1 = 0, num2[15], pp2 = 0, pp3 = 0; for(int i = 2; i <= n; i ++){ for(int j = 2; j <= n; j ++){ memset(num1, 0, sizeof num1); memset(num2, 0, sizeof num2); pp1 = pp2 = pp3 = 0; for(int k = 6; k >= 1; k --){ if(a1[i][j][k] != '\0'){ pp3 = k; break; } } if(pp3 > 1) continue; for(int k = pp3; a1[i][j][k] >= 1; k --) num1[++pp1] = map[a1[i][j][k]]; num2[++pp2] += (map[a1[1][i][1]] + map[a1[1][j][1]]); while(num2[pp2] / (n-1)){ num2[pp2+1] += num2[pp2] / (n-1); num2[pp2++] %= (n-1); } if(pp1 != pp2) return false; for(int i = 1; i <= pp1; i ++) if(num2[i] != num1[i]) return false; } } return true;}bool dfs(int now){ if(now > n-1){ if(check()){ for(int i = 1; i < n; i ++) printf("%c=%d ", b1[i], ans[i]); printf("\n"); return true; }else return false; } for(int i = 0; i < n-1; i ++){ if(!vis[i]){ vis[i] = 1; ans[now] = i; map[b1[now]] = i; if(dfs(now+1)) return true; vis[i] = 0; } } return false;}int main(){ scanf("%d", &n); for(int i = 1; i <= n; i ++) for(int j = 1; j <= n; j ++) scanf("%s", a1[i][j]+1); for(int i = 2; i <= n; i ++) b1[++cnt] = a1[1][i][1]; if(dfs(1)) printf("%d", n-1); else printf("ERROR!"); return 0;}
0 0
- 【洛谷 1013】 进制位
- 洛谷 P1013 进制位
- 洛谷 P1013 进制位
- 洛谷 P1013 [NOIP1998 T3] 进制位
- 搜索——洛谷P1013 进制位
- 洛谷 P1013 进制位 【搜索 + 进制运算】
- 1013
- 1013
- 1013
- 1013
- 1013
- 1013
- 1013
- 1013
- 1013
- 1013
- 1013
- 1013
- 将两个有序链表并为一个有序链表
- 输出一个整数的每一位
- 自定义RadioGroup样式
- 数据结构看书笔记(八)--图
- 知乎 SVM图解
- 【洛谷 1013】 进制位
- 一致性哈希算法的应用
- 我侬词
- APP测试准备
- DBUtil操作的config.properties
- 总结23
- HDU_1518_Square
- Dialog
- <1>JAVA对异常的捕获机制