14 条题解

  • -1
    @ 2024-9-22 16:26:42

    B1.三连击

    思路

    这道题刚拿到就想到使用递归一个数位一个数位去推 。 搞一个函数,参数有h表示推到了第几个数位和a,b,c。 a,b,c按照题意理解就行了。
    但写代码的时候发现如果不优化递归,时间复杂度会变成999^{9},所以用了一个vis数组标记对应的1,2,3......这些数字在前面有没有被用过。
    这样就减少了时间复杂度,又满足了题目中1到9每个数字只能用一次的限制条件。

    Code

    #include<bits/stdc++.h>
    using namespace std;
    bool vis[105];
    void fun(int h,int a,int b,int c)
    {
    	if(h==10)
    	{
    		if(2*a==b && 3*a==c)
    			cout<<a<<" "<<b<<" "<<c<<endl;
    		return;
    	}
    	for(int i=1;i<=9;i++)
    	{
    		if(!vis[i])
    		{
    			vis[i]=1;
    			if(h<=3) 
    				fun(h+1,a*10+i,b,c);
    			else if(h<=6)
    				fun(h+1,a,b*10+i,c);
    			else
    				fun(h+1,a,b,c*10+i);
    			vis[i]=0;
    		}
    	}
    }
    int main()
    {
    	fun(1,0,0,0); 
    	return 0;
     } 
    

    信息

    ID
    32
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    327
    已通过
    174
    上传者