先上代码:
#includeusing namespace std; bool check(int x,int y,int z) { int map[10] = {0}; map[0] = -1; map[x]++; map[y]++; map[z]++; int second[3],third[3]; second[0] = 2 * z % 10; second[1] = (2 * y + 2 * z / 10) % 10; second[2] = 2 * x + (2 * y + 2 * z / 10) / 10; third[0] = 3 * z % 10; third[1] = (3 * y + 3 * z / 10) % 10; third[2] = 3 * x + (3 * y + 3 * z / 10) / 10; if(second[2] > 9 || third[2] > 6) return false; if(map[second[0]] != 0 || map[second[1]] != 0 || map[second[2]] != 0 || map[third[0]] != 0 || map[third[1]] != 0 || map[third[2]] != 0) return false; return true; } void show(int x,int y,int z) { cout << x * 100 + y * 10 + z << " "; cout << 2*z % 10 + (2*y + 2*z / 10) % 10 * 10 + 2*x + (2*y + 2*z / 10) * 10; cout << " "; cout << 3*z % 10 + (3*y + 3*z / 10) % 10 * 10 + 3*x + (3*y + 3*z / 10) * 10; cout << endl; } int main() { for(int i = 1;i < 4;++i) { for(int j = 1;j < 10;++j) { for(int k = 1;k < 10;++k) { if(i == j || i == k || j == k) continue; if(check(i,j,k)) { show(i,j,k); } } } } return 0; }
解题思路:
emmmm其实感觉没什么好写的,单纯模拟题。先大致判断第一个数的范围,不会超过333,那就对123开始到333(其实这份代码遍历的多了遍历到了399)进行遍历判断就可以了,如果有重复的数字之间continue,如果都是不重复的数,就引用check函数对后面两个数进行判断,如果有重复就返回false,否则返回true把结果打印。
最终数据里第一组数据从192开始,最后一组数据从327开始,emmmm大概就是这样,暴力模拟。


![[NOIP1998 普及组] 三连击 [NOIP1998 普及组] 三连击](http://www.mshxw.com/aiimages/31/691150.png)
