三连击

题目

代码

最开始的思路,九个数字,那就分别对每一位从1-9都试一遍,所以是九个for循环,其中保证前面用过的数字后面不用的方法就是在for里面设置条件让i2!=i1啥的,代码如下,但是不完全正确。

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int xx,yy,zz;
//    int a[10]={0,1,2,3,4,5,6,7,8,9};
//    int mark[10]={0};
//    mark[0]=1;
    int res=0;
    cin>>xx>>yy>>zz;
    
    for(int i1=1;i1<=9;i1++){
        for(int i2=1;i2<=9;i2++){
            if(i2==i1) continue;
            for(int i3=1;i3<=9;i3++){
                if(i3==i1||i3==i2) continue;
                for(int i4=1;i4<=9;i4++){
                    if(i4==i1||i4==i2||i4==i3)  continue;
                    for(int i5=1;i5<=9;i5++){
                        if(i5==i1||i5==i2||i5==i3||i5==i4) continue;
                        for(int i6=1;i6<=9;i6++){
                            if(i6==i1||i6==i2||i6==i3||i6==i4||i6==i5) continue;
                            for(int i7=1;i7<=9;i7++){
                                if(i7==i1||i7==i2||i7==i3||i7==i4||i7==i5||i7==i6) continue;
                                for(int i8=1;i8<=9;i8++){
                                    if(i8==i1||i8==i2||i8==i3||i8==i4||i8==i5||i8==i6||i8==i7) continue;
                                    for(int i9=1;i9<=9;i9++){
                                        if(i9==i1||i9==i2||i9==i3||i9==i4||i9==i5||i9==i6||i9==i7||i9==i8) continue;
                                        int aa=i1*100+i2*10+i3;
                                        int bb=i4*100+i5*10+i6;
                                        int cc=i7*100+i8*10+i9;
                                        if(aa/xx==bb/yy&&aa/xx==cc/zz&&bb/yy==cc/zz){
                                            cout<<aa<<" "<<bb<<" "<<cc<<endl;
                                            res++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    if(res==0){
        cout<<"No!!!"<<endl;
    }
    return 0;
}

用DFS的方法,其实就是全排列+一个是否满足比例的判断

#include<iostream>
using namespace std;
int mark[10] = {0};
int a[10];
int x,y,z;
int res=0;
int flag=0;

void dfs(int index)
{

    if(index==10)
    {
        int num1=a[1]*100+a[2]*10+a[3];
        int num2=a[4]*100+a[5]*10+a[6];
        int num3=a[7]*100+a[8]*10+a[9];
        if(num2*x==num1*y&&num3*x==num1*z&&num3*y==num2*z)
        {
            {
                {

                    cout<<a[1]<<a[2]<<a[3]<<" "<<a[4]<<a[5]<<a[6]<<" "<<a[7]<<a[8]<<a[9]<<endl;
                    flag=1;
                    cout<<endl;
                    return ;
                }
            }
        }
    }

    else
    {
        for(int i=1; i<=9; i++)
        {
            if(!mark[i])
            {
                mark[i]=1;
                a[index]=i;
                dfs(index+1);
                mark[i]=0;
            }
        }
    }


}

int main()
{
    cin>>x>>y>>z;
    dfs(1);
    if(flag==0){
        cout<<"No!!!"<<endl;
    }

    return 0;
}

全排列有函数,next_permutation

#include<iostream>
#include<algorithm>
using namespace std;
int a,b,c;
int sum=0;
int ans[10]={0,1,2,3,4,5,6,7,8,9};
int flag=0;
void check();
int main()
{
	cin>>a>>b>>c;
	do
	{
		check();
	}while(next_permutation(ans+1,ans+10));
	if(flag==0)
	cout<<"No!!!";
}
void check()
{
	int num1,num2,num3;
	num1=ans[1]*100+ans[2]*10+ans[3];
	num2=ans[4]*100+ans[5]*10+ans[6];
	num3=ans[7]*100+ans[8]*10+ans[9];
	if(num2*a==num1*b&&num3*a==num1*c&&num3*b==num2*c)
	{
			cout<<ans[1]<<ans[2]<<ans[3]<<" "<<ans[4]<<ans[5]<<ans[6]<<" "<<ans[7]<<ans[8]<<ans[9]<<endl;
			flag=1;
	}
	return ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值