蒟蒻求助,为什么没法找到呢?输出全是NO

P1618 三连击(升级版)

daonan @ 2022-02-04 23:59:40

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int x,y,z;
    int ass=0;
    cin>>x>>y>>z;
    for(int a=1;a<=9;a++)
    {
        for(int b=1;b<=9&&b!=a;b++)
        {
            for(int c=1;c<=9&&c!=a&&c!=b;c++)
            {
                for(int d=1;d<=9&&d!=a&&d!=b&&d!=c;d++)
                {
                    for(int e=1;e<=9&&e!=a&&e!=b&&e!=c&&e!=d;e++)
                    {
                        for(int f=1;f<=9&&f!=a&&f!=b&&f!=c&&f!=d&&f!=e;f++)
                        {
                            for(int g=1;g<=9&&g!=a&&g!=b&&g!=c&&g!=d&&g!=e&&g!=f;g++)
                            {
                                for(int h=1;h<=9&&h!=a&&h!=b&&h!=c&&h!=d&&h!=e&&h!=f&&h!=g;h++)
                                {
                                    for(int i=1;i<=9&&i!=a&&i!=b&&i!=c&&i!=d&&i!=e&&i!=f&&i!=g&&i!=h;i++)
                                    {
                                        int t=a*100+b*10+c;
                                        int j=d*100+e*10+f;
                                        int k=g*100+h*10+i;
                                        if((double)(t/j)==(double)(x/y)&&(double)(j/k)==(double)(y/z))
                                        {
                                            cout<<a<<b<<c<<' '<<d<<e<<f<<' '<<g<<h<<i<<endl;
                                            ass++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    if(ass==0)
    cout<<"No!!!";
    return 0;
}

by L_cm_C5H6 @ 2022-02-05 00:21:48

用内部if判断吧...你这样不是进一个循环直接被后面的不等于语句跳出去了么


by coldy_rainy @ 2022-02-05 00:46:20

@daonan

相似算法参考:


#include<bits/stdc++.h> 
using namespace std;
int main()
{
    int a,b,c,a1,a2,a3,a4,a5,a6,a7,a8,a9,yi,er,san;
    bool flag=false;
    cin>>a>>b>>c;
    for(a1=1;a1<=9;a1++)
    {
        for(a2=1;a2<=9;a2++)
        {
            if(a2==a1)continue;
            for(a3=1;a3<=9;a3++)
            {
                if(a3==a1||a3==a2)continue;
                for(a4=1;a4<=9;a4++)
                {
                    if(a4==a3||a4==a2||a4==a1)continue;
                    for(a5=1;a5<=9;a5++)
                    {
                        if(a5==a4||a5==a3||a5==a2||a5==a1)continue;
                        for(a6=1;a6<=9;a6++)
                        {
                            if(a6==a5||a6==a4||a6==a3||a6==a2||a6==a1)continue;
                            for(a7=1;a7<=9;a7++)
                            {
                                if(a7==a6||a7==a5||a7==a4||a7==a3||a7==a2||a7==a1)continue;
                                for(a8=1;a8<=9;a8++)
                                {
                                    if(a8==a7||a8==a6||a8==a5||a8==a4||a8==a3||a8==a2||a8==a1)continue;
                                    for(a9=1;a9<=9;a9++)
                                    {
                                        if(a9==a8||a9==a7||a9==a6||a9==a5||a9==a4||a9==a3||a9==a2||a9==a1)continue;
                                        yi=a1*100+a2*10+a3;
                                        er=a4*100+a5*10+a6;
                                        san=a7*100+a8*10+a9;
                                        if(yi*1.0/er==a*1.0/b&&yi*1.0/san==a*1.0/c&&er*1.0/san==b*1.0/c)
                                        {
                                            cout<<yi<<" "<<er<<" "<<san<<endl; 
                                            flag=true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    if(flag==false)cout<<"No!!!"<<endl;
    return 0;
}

by daonan @ 2022-02-05 16:54:09

@penhaochen 好的,明白了,谢谢dalao!


by daonan @ 2022-02-05 16:56:02

@L_cm_C5H6 qwq就是遍历后只选取九个数字都不一样的状况呀,本蒟蒻感觉好像问题不大?


by L_cm_C5H6 @ 2022-02-05 17:42:01

@daonan 你把条件写到for判断那里的话不是相当于一旦a==b之后就a+=1了么 大概只能枚举a>b>c>d>e...这样吧

你的程序大概是这样运行的?

第一层循环a=1:

第二层循环b=1: {...}

满足a==b直接退出二层循环回到第一层

a++  

a = 2 

...

调试看看应该更清楚点


by daonan @ 2022-02-05 19:01:47

@L_cm_C5H6 哦哦我明白了,确实是这样的,谢谢大佬!


by fyder_anran @ 2022-02-05 22:23:11

@daonan

我来解释一下:

其实这道题很明显的水模拟题完全不用电风扇(dfs)做......

就拿这一段代码来说:

for(int i=1;i<=9&&i!=a&&i!=b&&i!=c&&i!=d&&i!=e&&i!=f&&i!=g&&i!=h;i++)

这里的判断是跳出循环的判断

我们要完成的是 \textit{continue} 而不是该 错误 代码要完成的 break

所以所有的特判都应该放在循环里面

题外话:如果这道题是四连击用 On^\textit{16} 来做必爆无疑

所以,试着用字符 STL 大法优化一下吧!


by fyder_anran @ 2022-02-05 22:27:41

@daonan 这个题目优化算法可以延伸到:P2359,难度 不太大 但是调试要 调一天 ,试着理解一下(我不李姐


by daonan @ 2022-02-05 23:51:32

@shaoziqi qwq我还没(bu)做(hui)过(zuo)绿题,还在黄橙题扑腾


|