• 三羊献瑞|2015年蓝桥杯B组题解析第三题-fishers


    三羊献瑞

    观察下面的加法算式:

      祥 瑞 生 辉
    
    • 三 羊 献 瑞

    三 羊 生 瑞 气

    (如果有对齐问题,可以参看【图1.jpg】)

    其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。

    请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

    答案:1085

    思路一:暴力法,8层循环,从0~9中选8个数参与加法运算,筛选条件:满足abcd+efgb = efcbx

    思路二:dfs求全排列,筛选条件满足:abcd+efgb = efcbx

    代码一暴力枚举:

    #include<iostream>
    using namespace std;
    
    /*枚举法,暴力解法*/
    
    int main(){
    //	abcd + efgb
    	for(int a = 1;a<=9;a++){
    		for(int b = 0;b<=9;b++){
    			if(b == a){
    				continue;
    			}
    			for(int c = 0;c<=9;c++){
    				if(c==b || c==a){
    					continue;
    				}
    				for(int d = 0;d<=9;d++){
    					if(d==c || d==b || d==a){
    						continue;
    					}
    					for(int e = 1;e<=9;e++){
    						if(e==d || e==c ||e ==b || e==a){
    							continue;
    						}
    						for(int f=0;f<=9;f++){
    							if(f == e|| f==d ||f == c || f==b || f==a){
    								continue;
    							}
    							for(int g=0;g<=9;g++){
    								if(g==f ||g == e|| g== d|| g==c ||g == b|| g==a){
    									continue;
    								}
    
    								int x = a*1000+b*100+c*10+d;
    								int y = e*1000+f*100+g*10+b;
    								int z = e*10000+f*1000+c*100+b*10;
    								//筛选条件 
    								for(int i=0;i<=9;i++){
    									if(i==a||i==b||i==c||i==d||i==e||i==f||i==g){
    										continue;
    									}
    									
    									if(x+y == z+i){
    										cout<<y<<endl;
    									}
    								}
    								
    							}
    						}
    						
    					}
    				}
    			}
    		}
    	}
    	return 0;
    }
    

    代码二dfs全排列:

    #include<iostream>
    using namespace std;
    
    bool visited[10];
    int arr[10];
    
    
    //参数k表示第k个位置 共8个位置 abcd + efgh 
    void dfs(int k){
    	if(k==9){
    		//判断条件
    		int x = 1000*arr[1] + 100*arr[2] + 10*arr[3] + arr[4];
    		int y = 1000*arr[5] + 100*arr[6] + 10*arr[7] + arr[2];
    		int z = 10000*arr[5] + 1000*arr[6] + 100*arr[3] + 10*arr[2];
    		for(int i = 0;i<=9;i++){
    			if(!visited[i]){
    				z = z + i;
    				if(z == x+y){
    					cout<<y<<endl;
    				}
    				z = z - i;
    			}
    		} 
    		return; 
    	}
    	if(k==1 || k==5){
    		for(int i=1;i<=9;i++){
    			if(!visited[i]){
    				visited[i] = true;
    				arr[k] = i;
    				dfs(k+1);
    				visited[i] = false;
    			}
    		}
    	}else{
    		for(int i=0;i<=9;i++){
    			if(!visited[i]){
    				visited[i] = true;
    				arr[k] = i;
    				dfs(k+1);
    				visited[i] = false;
    			}
    		}		
    	}
    }
    
    int main(){
    	dfs(1);
    } 
    
  • 相关阅读:
    Proteus仿真与实际的差别
    用 Proteus学习51单片机之1602液晶
    用Proteus学习51单片机之中断
    用Proteus学习51单片机之键盘
    用Proteus学习51单片机之数码管
    PHPnow 安装服务 [ Apache_pn ] 失败的解决方法 for[windows7/vista]
    chrome 不能打印背景图的解决方法
    JS 无块级作用域
    IE6下zindex犯癫不起作用bug的初步研究
    ie6下的js调试工具companion.js
  • 原文地址:https://www.cnblogs.com/fisherss/p/10299294.html
Copyright © 2020-2023  润新知