\第七届蓝桥杯大赛个人赛省赛(软件类)3 凑算式 【全排列解法】

这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?

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

  

看了下网上的方法,大多是用暴力枚举或者dfs回溯的,看到这个题我的第一想法就是全排列,一说全排列那自然而然就是next_permutation 函数了,在每次的排列情况下判断是否符合条件 ,问题解决。(这里也可以用乘法代替除法的思想来处理一下 ,避免麻烦)

答案是:29

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int a[10]={1,2,3,4,5,6,7,8,9};
	///////////A B C D E F G H I
	int count = 0;
	while(next_permutation(a,a+9)){
		//A*C*G*H*I + B*G*H*I + D*E*F*C ==10*C*G*H*I
		if(a[0]+a[1]*1.00/a[2]+(a[3]*100+a[4]*10+a[5])*1.00/(a[6]*100+a[7]*10+a[8])*1.00==10){
			cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "  <<a[3]<<" "  <<a[4]<<" "  <<a[5]<<" "  <<a[6]<<" "  <<a[7]<<" "<<a[8]<<" "  ;  
			count ++ ;
			cout<<endl;
		}
		
	}
	cout<<count;
	return 0;
} 

java 的dfs写法:

package demo;

public class Main凑算式 {
	static int a[] =new int [9];
	static boolean B []=new boolean [9];
	static int count = 0;
	static void cou(int cur){
		if(cur == 9){
			if(check()){
				count++;
			}
		}else{
			for(int i = 0;i<9;i++){
				if(B[i] == false){
					B[i] = true;
					a[cur] = i+1;
					cou(cur+1);
					B[i] = false;
				}
			}
		}
	}
	
	
	
	private static boolean check() {
		if(a[0]+a[1]*1.00/a[2]+(a[3]*100+a[4]*10+a[5])*1.00/(a[6]*100+a[7]*10+a[8])*1.00==10){
			return true;
		}
		return false;
	}



	public static void main(String[] args) {
			for(int i=0;i<9;i++){
				B[i] = false;
			}
			cou(0);
			System.out.println(count);
	}

}



posted @ 2018-02-21 12:02  凌乱533  阅读(96)  评论(0编辑  收藏  举报