luoguP1092虫食算(dfs)
来源:互联网 发布:seo怎么自学 编辑:程序博客网 时间:2024/05/17 02:48
题目简要
我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1。
#include <iostream>#include <cstdio>#include <cstdlib>#include <string>#include <algorithm>using namespace std;int N;string equ[3];int alphabet2Num[30];int right2Left[30];//存字母序号int used[30];int str2Num(string s){ int num = 0,tmp = 1; for (int i = s.length() - 1; i >= 0; --i) { num += alphabet2Num[s[i]-'A'] * tmp; tmp *= N; } return num;}//最后的转换也可能耗时间bool check(){ int num1,num2,num3; int tmp; num1 = str2Num(equ[0]); num2 = str2Num(equ[1]); num3 = str2Num(equ[2]); tmp = num1 + num2; return (tmp == num3);}//优化取模看是否能提高速度bool check2(){ //逐位测试 for (int i = N-2; i >= 1; --i) { if(alphabet2Num[equ[0][i] - 'A'] != -1 && alphabet2Num[equ[1][i] - 'A'] != -1 && alphabet2Num[equ[2][i] - 'A'] != -1){ if((alphabet2Num[equ[0][i] - 'A'] + alphabet2Num[equ[1][i] - 'A']) % N != alphabet2Num[equ[2][i] - 'A'] && (alphabet2Num[equ[0][i] - 'A'] + alphabet2Num[equ[1][i] - 'A'] + 1) % N != alphabet2Num[equ[2][i] - 'A']) return true; } } return false;}void dfs(int n){ if(n >= N ){ if(check()){ for (int i = 0; i < N; ++i) { cout << alphabet2Num[i] << " "; } exit(0); } return; } else { if(n >= 3 && (alphabet2Num[equ[0][N-1] - 'A'] + alphabet2Num[equ[1][N-1] - 'A']) % N != alphabet2Num[equ[2][N-1] - 'A']){ return; } if((alphabet2Num[equ[0][0] - 'A'] + alphabet2Num[equ[1][0] - 'A']) >= N) return; if(n >= 3 && check2()) return; for (int i = N-1; i >= 0; --i) { if(used[i] == 0){ used[i] = 1; alphabet2Num[right2Left[n]] = i; dfs(n+1); used[i] = 0; alphabet2Num[right2Left[n]] = -1; } } }}//200多ms的代码int main(){ cin >> N; for (int i = 0; i < 3; ++i) { cin >> equ[i]; } int useAlphabet[30]; for (int j = 0; j < N; ++j) { alphabet2Num[j] = -1; useAlphabet[j] = 0; } int index = 0; for (int k = N-1; k >= 0; --k) { for (int i = 0; i < 3; ++i) { if(useAlphabet[equ[i][k] - 'A'] == 0){ useAlphabet[equ[i][k] - 'A'] = 1; right2Left[index++] = equ[i][k] - 'A'; } } } dfs(0);}
1 0
- luoguP1092虫食算(dfs)
- 洛谷 1092 虫食算 (dfs+剪枝)
- HDU 4090 GemAnd Prince (DFS+BFS)/(DFS+DFS)
- (一般)POJ-2718 DFS套DFS
- 虫食算 dfs+剪枝
- pku 1011(dfs)
- poj1321(dfs)
- 1691(dfs + 回溯)
- 【hdu】Zipper (dfs)
- 求解迷宫(DFS)
- hdu1241(DFS入门)
- POJ 3194 (DFS)
- hdu 2181 (dfs)
- hdu 1241 (dfs)
- zoj 3175 (dfs)
- hdu 1016 (DFS)
- hdu 1045 (DFS)
- uva10004(bfs||dfs)
- 团体程序设计天梯赛-练习集 L3-001. 凑零钱 强行dfs+剪枝 解题报告
- C++动态二维对象数组
- Java基础知识
- 数据结构绪论
- c++ assert() 使用方法
- luoguP1092虫食算(dfs)
- 【iOS app加密】iOS app之游戏加密防破解
- 北航计算机机试09字符串的查找删除
- CCF 201503-3节日
- Java开发岗位面试题归类汇总三:Java Web
- 笔试总结
- Leetcode-15. 3Sum
- 使用alter database create datafile恢复丢失数据文件
- 两个ListView联动效果(仿礼物说)