zoukankan      html  css  js  c++  java
  • 征战蓝桥 —— 2016年第七届 —— C/C++A组第6题——寒假作业

    题目

    现在小学的数学题目也不是那么好玩的。
    看看这个寒假作业:

    □ + □ = □
    □ - □ = □
    □ × □ = □
    □ ÷ □ = □

    (如果显示不出来,可以参见【图7-1.jpg】)

    每个方块代表1~13中的某一个数字,但不能重复。
    比如:
    6 + 7 = 13
    9 - 8 = 1
    3 * 4 = 12
    10 / 2 = 5

    以及:
    7 + 6 = 13
    9 - 8 = 1
    3 * 4 = 12
    10 / 2 = 5

    就算两种解法。(加法,乘法交换律后算不同的方案)

    你一共找到了多少种方案?

    请填写表示方案数目的整数。
    注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

    代码

    #include <cstdio>
    using namespace std;
    int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13};
    int ans;
    bool check(){
        if(a[0]+a[1]==a[2]&&
           a[3]-a[4]==a[5]&&
           a[6]*a[7]==a[8]&&
           a[9]%a[10]==0&&
           a[9]/a[10]==a[11])
            return true;
        return false;
    }
    void f(int k){
        if(k==13){
            if(check()){
                printf("%d+%d=%d  %d-%d=%d  %d*%d=%d  %d/%d=%d\n",
                       a[0],a[1],a[2],
                       a[3],a[4],a[5],
                       a[6],a[7],a[8],
                       a[9],a[10],a[11]);
                ans++;
            }
        }
        for (int i = k; i < 13; ++i) {
            {int t=a[i];a[i]=a[k];a[k]=t;}
    //        提前排除,提升效率
            if((k==2&&a[0]+a[1]!=a[2]) || k==5&&a[3]-a[4]!=a[5]){
                {int t=a[i];a[i]=a[k];a[k]=t;}
                continue;
            }
            f(k+1);
            {int t=a[i];a[i]=a[k];a[k]=t;}
        }
    }
    int main(int argc, const char * argv[]) {
        f(0);
        printf("%d\n",ans);
        return 0;
    }
    

    简单实现

    编程大题不能这样做,会超时。

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <cstdio>
    using namespace std;
    int main()
    {
    	int array[13],ans=0;
    	for(int i=0;i<13;i++)
    		array[i]=i+1;
    	do
    	{
    		if(array[0]+array[1]!=array[3]
    		 ||array[4]-array[5]!=array[6]
    		 ||array[7]*array[8]!=array[9]
    		 ||array[10]/array[11]!=array[12]
    		 ||array[10]%array[11]!=0)
    		 continue;
    		if(array[0]+array[1]==array[3]
    		 &&array[4]-array[5]==array[6]
    		 &&array[7]*array[8]==array[9]
    		 &&array[10]/array[11]==array[12]
    		 &&array[10]%array[11]==0)
    		 {
    		 	ans++;
    			printf("%2d+%2d=%2d  ",array[0],array[1],array[3]);
    			printf("%2d-%2d=%2d  ",array[4],array[5],array[6]);
    			printf("%2d*%2d=%2d  ",array[7],array[8],array[9]);
    			printf("%2d/%2d=%2d  ",array[10],array[11],array[12]);
    			cout<<endl;
    		}
    	}while(next_permutation(array,array+13));
    	cout<<ans<<endl;
    	return 0;
    }
    
  • 相关阅读:
    hdu 1455 N个短木棒 拼成长度相等的几根长木棒 (DFS)
    hdu 1181 以b开头m结尾的咒语 (DFS)
    hdu 1258 从n个数中找和为t的组合 (DFS)
    hdu 4707 仓鼠 记录深度 (BFS)
    LightOJ 1140 How Many Zeroes? (数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3652 B-number (数位DP)
    HDU 5900 QSC and Master (区间DP)
    HDU 5901 Count primes (模板题)
    CodeForces 712C Memory and De-Evolution (贪心+暴力)
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12338701.html
Copyright © 2011-2022 走看看