Fork me on GitHub

简单排列习题2.5 的 2 - 6 P35

用1,2,3,...9组成3个3位数abc, def, ghi;每个数字恰好用一次,要求 abc:def :ghi = 1: 2 : 3;按照abc : def : ghi的格式输出。

通常想到的思路为枚举9个数, 然后再去判断;这样的话最小复杂度为9 * 9 * 9;

枚举消耗的时间相对来说较大,当枚举的范围过大时,我们可以根据条件减小枚举范围;

题中给出了一个等式;

根据这个等式我们可以先枚举出abc的值;

然后根据abc的值去算出bcd, ghi的值;再来判断;

这样的复杂度会减小很多

#include<bits/stdc++.h>

#define clr(x) memset(x, 0, sizeof(x))

#define LL long long

using namespace std;

const int INF = 0x3f3f3f3f;

const int maxn = 100005;

int main()

{

int a;

int vis[15];

for(int i = 1; i <= 9; i++)

for(int j = 1; j <= 9; j++)

for(int k = 1; k <= 9; k++)

{

if(i == j || i == k || k == j)

continue;

clr(vis);

int a = i * 100 + j * 10 + k;

int b = 2 * a;

int c = 3 * a;

vis[i] = 1;

vis[j] = 1;

vis[k] = 1;

vis[b % 10] = 1;

vis[b / 100] = 1;

vis[(b / 10) % 10] = 1;

vis[c % 10] = 1;

vis[c / 100] = 1;

vis[(c / 10) % 10] = 1;

int flag = 1;

for(int l = 1; l <= 9; l++)

{

if(!vis[l])

{

flag = 0;

break;

}

}

if(flag)

{

printf("%d %d %d\n", a, b, c);

}

}

return 0;

}

posted @ 2017-03-30 10:57  lMonster81  阅读(222)  评论(1编辑  收藏  举报
/*评论*/ /*top按钮*/

/* 网易云控件 */