這道題是第三屆藍橋杯中的題,原題是這樣的:
匪警請撥110,即使手機欠費也可撥通!
爲了保障社會秩序,保護人民羣衆生命財產安全,警察叔叔需要與罪犯鬥智鬥勇,因而需要經常性地進行體力訓練和智力訓練!
某批警察叔叔正在進行智力訓練:
1 2 3 4 5 6 7 8 9 = 110;
請看上邊的算式,爲了使等式成立,需要在數字間填入加號或者減號(可以不填,但不能填入其它符號)。之間沒有填入符號的數字組合成一個數,例如:12+34+56+7-8+9 就是一種合格的填法;123+4+5+67-89 是另一個可能的答案。
請你利用計算機的優勢,幫助警察叔叔快速找到所有答案。
每個答案佔一行。形如:
12+34+56+7-8+9
123+4+5+67-89
......
已知的兩個答案可以輸出,但不計分。
各個答案的前後順序不重要。
注意:
請仔細調試!您的程序只有能運行出正確結果的時候纔有機會得分!
請把所有類寫在同一個文件中,調試好後,存入與【考生文件夾】下對應題號的“解答.txt”中即可。
相關的工程文件不要拷入。
請不要使用package語句。
源程序中只能出現JDK1.5中允許的語法或調用。不能使用1.6或更高版本。
這道題只是考尋路問題而已。我改了一下。把路徑也可以打印出來了。
分析:
這道題,只要切入點找準了,就可以很快解出來,我的解法是這樣的,這裏有9個數字,那麼數字與數字之間有八個空,每個空的有三種情況:加號、減號、空,每個空有三種可能,一共有八個空,所以有3^8=6561中可能,這種方法是窮舉所有的可能情況,所以個人感覺還可以優化!
編程時候,我用8個整數的整形數組來記錄這八個空情況,0代表沒有插入,1代表插入"+"號,2代表插入”-“,最後通過該整形數組轉換成對應的表達式,再計算其最終結果,如果爲110,則輸出!
java代碼如下:
public class oneOneZero
{
public static void main(String[] args)
{
int[] result=new int[8];
getResult(0,result);
}
//使用遞歸求出3^8種情況
public static void getResult(int index,int[] result){
if(index==8){
showResult(result);//根據數組的取值轉換成表達式,且求值,這方法有待改進,寫的很亂
return;
}
//每個空有三種可能,0,1,2
for(int i=0;i<3;i++){
result[index]=i;
getResult(index+1,result);
result[index]=0; //恢復原來的狀態
}
}
public static void showResult(int[] result){
int sum=0;
//默認在第一個數字,即1之前是"+"號,方便編程而已
char operateChar='+';
String[] source=new String[]{"1","2","3","4","5","6","7","8","9"};
//最終的表達式,最好用StringBuilder,在非多線程的情況下,字符串拼接的性能,StringBuilder最好,
//當然用StringBuffer或者單純的String也可以
StringBuilder expression=new StringBuilder();
//用於記錄臨時的數字,因爲參與運算的數字可能是幾位的數字,所以也需要拼接
StringBuilder number=new StringBuilder();
//先加入第一個字符,即1
number.append(source[0]);
expression.append(source[0]);
for(int i=0;i<result.length;i++){
if(result[i]==0){//如果爲0,表示數字合併
number.append(source[i+1]);
expression.append(source[i+1]);
}else if(result[i]==1){
sum=calc(operateChar,sum,number);
operateChar='+';
number.append(source[i+1]);
expression.append("+").append(source[i+1]);
}else if(result[i]==2){
sum=calc(operateChar,sum,number);
operateChar='-';
number.append(source[i+1]);
expression.append("-").append(source[i+1]);
}
}
sum=calc(operateChar,sum,number);
if(sum==110){
System.out.print(expression.toString()+"=110");
System.out.println();
}
}
public static int calc(char operateChar,int sum,StringBuilder number){
if(operateChar=='+'){
sum+=Integer.parseInt(number.toString());
number.delete(0, number.length());
}else if(operateChar=='-'){
sum-=Integer.parseInt(number.toString());
number.delete(0, number.length());
}
return sum;
}
}
輸出結果:
123+4+5+67-89=110
123+4-5-6-7-8+9=110
123-4+5-6-7+8-9=110
123-4-5+6+7-8-9=110
12+34+56+7-8+9=110
12+3+45+67-8-9=110
12-3+4-5+6+7+89=110
1+234-56-78+9=110
1+2+34+5+67-8+9=110
1-2+3+45-6+78-9=110