栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[NOIP1998 普及组] 三连击

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[NOIP1998 普及组] 三连击

先上代码:

#include

using 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大概就是这样,暴力模拟。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/691150.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号