此题为小白书暴力求解法的训练参考
翻译请戳 http://luckycat.kshs.kh.edu.tw/
解题思路
由于以确定括号,所以就是一层一层地计算下去。
计算中间结果可用另一变量存储,这样回溯的时候就不会太麻烦。
详见代码
代码
#include<stdio.h> #include<string.h> //#define LOCAL const int maxLen = 5; bool used[maxLen], yes; int number[maxLen]; char oper[] = {'+','-','*'}; void Search(int left, int res) { if(left==0 && res!=23) return ; else if(left==0 && res==23) { yes=true; return ; } for(int i=0; i<maxLen; i++) if(!used[i]){ for(int k=0; k<3; k++) { int mid = res; switch(oper[k]) { case '+':{ mid+=number[i]; used[i]=true; break; } case '-':{ mid-=number[i]; used[i]=true; break; } case '*':{ mid*=number[i]; used[i]=true; break; } default: break; } Search(left-1, mid); used[i] = false; } } } int main() { #ifdef LOCAL freopen("data.txt", "r", stdin); freopen("ans.txt", "w", stdout); #endif bool flag = true; for(int i=0; i<maxLen; i++) { scanf("%d", &number[i]); if(number[i] != 0) flag = false; } while(!flag) { for(int i=0; i<maxLen&&!yes; i++) { used[i] = true; Search(maxLen-1, number[i]); used[i] = false; } if(yes) printf("Possible\n"); else printf("Impossible\n"); flag = true; for(int i=0; i<maxLen; i++) { scanf("%d", &number[i]); if(number[i] != 0) flag = false; } memset(used, 0, sizeof(used)); yes = false; } return 0; }