算法学习(2)用排列解决的几个问题

用第二种方法解决的全排列的问题:

package competition;

import java.util.Scanner;

public class Fullpermutation {
public static int count=0;
	
	public static void main(String[] args) {
		String[] str=new String[3];
		Scanner scanner=new Scanner(System.in);
	
		for (int i = 0; i < 3; i++) {
			str[i]=scanner.nextInt()+"";
		}
		
		arrang(str,0,str.length);
		System.out.println(count);
		
	}

	private static void arrang(String[] str, int start, int len) {
		// TODO Auto-generated method stub
		if(start==len-1) {
			for(int i=0;i<len;i++) {
				System.out.printf(str[i]);
			}
			System.out.println();
			count++;
		}else {
			for(int i=start;i<len;i++) {
				
				swap(str,start,i);
				arrang(str, start+1, len);
				swap(str,start,i);
			}
		}
	}

	private static void swap(String[] str, int i, int j) {
		// TODO Auto-generated method stub
		String temp=new String();
		temp=str[i];
		str[i]=str[j];
		str[j]=temp;
	}
}
感觉比算法学习01里的要好理解。

顺便做了四道简单的题目:

1.

1. 猜算式

看下面的算式:

□□ x □□ = □□ x □□□

它表示:两个两位数相乘等于一个两位数乘以一个三位数。

如果没有限定条件,这样的例子很多。

但目前的限定是:这9个方块,表示1~99个数字,不包含0

该算式中19的每个数字出现且只出现一次!

比如:

46 x 79 = 23 x 158

54 x 69 = 27 x 138

54 x 93 = 27 x 186

.....

请编程,输出所有可能的情况!

注意:

左边的两个乘数交换算同一方案,不要重复输出!

不同方案的输出顺序不重要

package competition;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Example_03 {
	public static int count=0;
	
	public static void main(String[] args) {
		String[] str=new String[9];
		Scanner scanner=new Scanner(System.in);
	
		for (int i = 0; i < 9; i++) {
			str[i]=scanner.nextInt()+"";
		}
		
		arrang(str,0,str.length);
		System.out.println(count);
		
	}

	private static void arrang(String[] str, int start, int len) {
		// TODO Auto-generated method stub
		if(start==len-1) {
//			for(int i=0;i<len;i++) {
//				System.out.printf(str[i]);
//			}
//			System.out.println();
			
			jisuan(str);
			count++;
		}else {
			for(int i=start;i<len;i++) {
				
				swap(str,start,i);
				arrang(str, start+1, len);
				swap(str,start,i);
			}
		}
	}
public static List result=new ArrayList();
	private static void jisuan(String[] str) {
		// TODO Auto-generated method stub
		StringBuffer sb=new StringBuffer();
		for (int i=0;i<str.length;i++) {
			sb.append(str[i]);
		}
		  String s1 = sb.toString().substring(0, 2);  
	        String s2 = sb.toString().substring(2, 4);  
	        String s3 = sb.toString().substring(4, 6);  
	        String s4 = sb.toString().substring(6); 
	        
	        int a1=Integer.parseInt(s1);
	        int a2 = Integer.parseInt(s2);  
	        int a3 = Integer.parseInt(s3);  
	        int a4 = Integer.parseInt(s4);  
	        if (a1 * a2 == a3 * a4) {  
	        	if(!result.contains(a1*a2)) {
	        		result.add(a1*a2);
	        		System.out.println(a1+"*"+a2+"="+a3+"*"+a4);
	        
	        }
	        }
	        
	}

	private static void swap(String[] str, int i, int j) {
		// TODO Auto-generated method stub
		String temp=new String();
		temp=str[i];
		str[i]=str[j];
		str[j]=temp;
	}

}

巧妙的解决了问题。

问题二是简单的问题,和问题一差不多:

2.

1.        填算式

 

/*

看这个算式:

☆☆☆+ ☆☆☆ = ☆☆☆

如果每个五角星代表1 ~ 9 的不同的数字。

这个算式有多少种可能的正确填写方法?

173 + 286 =459

295 + 173 =468

173 + 295 =468

183 + 492 =675

以上都是正确的填写法!

注意:

111 + 222 =333 是错误的填写法!

因为每个数字必须是不同的!

也就是说:1~9中的所有数字,每个必须出现且仅出现一次!

注意:

不包括数字“0”!

注意:

满足加法交换率的式子算两种不同的答案。

所以答案肯定是个偶数!

 

注意:

只要求计算不同的填法的数目

不要求列出所有填写法

更不要求填写源代码!

*/

 

package competition;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Example_12 {


		// TODO Auto-generated method stub
		public static int count=0;
		
		public static void main(String[] args) {
			String[] str=new String[9];
			Scanner scanner=new Scanner(System.in);
		
			for (int i = 0; i < 9; i++) {
				str[i]=scanner.nextInt()+"";
			}
			
			arrang(str,0,str.length);
			System.out.println(count);
			
		}

		private static void arrang(String[] str, int start, int len) {
			// TODO Auto-generated method stub
			if(start==len-1) {
//				for(int i=0;i<len;i++) {
//					System.out.printf(str[i]);
//				}
//				System.out.println();
				
				jisuan(str);
	//			count++;
			}else {
				for(int i=start;i<len;i++) {
					
					swap(str,start,i);
					arrang(str, start+1, len);
					swap(str,start,i);
				}
			}
		}
	public static List result=new ArrayList();
		private static void jisuan(String[] str) {
			// TODO Auto-generated method stub
			StringBuffer sb=new StringBuffer();
			for (int i=0;i<str.length;i++) {
				sb.append(str[i]);
			}
			  String s1 = sb.toString().substring(0, 3);  
		        String s2 = sb.toString().substring(3,6 );  
		        String s3 = sb.toString().substring(6);  
		  
		        
		        int a1=Integer.parseInt(s1);
		        int a2 = Integer.parseInt(s2);  
		        int a3 = Integer.parseInt(s3);    
		        if (a1 + a2 == a3 ) {  
//		        	if(!result.contains(a1+a2)) {
//		        		result.add(a1+a2);
	        		System.out.println(a1+"+"+a2+"="+a3);
		        count++;
//		        }
		        }
		        
		}

		private static void swap(String[] str, int i, int j) {
			// TODO Auto-generated method stub
			String temp=new String();
			temp=str[i];
			str[i]=str[j];
			str[j]=temp;
		}

	

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值