用第二种方法解决的全排列的问题:
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~9的9个数字,不包含0。
该算式中1至9的每个数字出现且只出现一次!
比如:
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;
}
}
}