Description
速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。
Input
输入数据占一行,给定四张牌。
Output
如果有解则输出"Y",无解则输出"N"。
Sample Input
A 2 3 6
Sample Output
Y
Source
找来的源码分析了下:
#include<stdio.h>
int t[4],i[4],flag=0;
char e[4];
/*递归全运算*/
void def(int a,float r)
{
if((int)(r+0.0000001)==24&&(int)(r-0.0000001)==23)
{
flag=1;}
if(a==3)return;
e[a]='+';
def(a+1,r+t[i[a+1]]);
e[a]='-';
def(a+1,r-t[i[a+1]]);
e[a]='*';
def(a+1,r*t[i[a+1]]);
e[a]='/';
def(a+1,r/t[i[a+1]]);
}
int main()
{
char t1[3];
int a;
for(a=0;a<4;a++)
{
/*用t1字符数组处理输入A,J,Q,K,10
*/
scanf("%s",&t1);
if(t1[0]=='1'&&t1[1]=='0')t[a]=10;
else if(t1[0]=='A')t[a]=1;
else if(t1[0]=='J')t[a]=11;
else if(t1[0]=='Q')t[a]=12;
else if(t1[0]=='K')t[a]=13;
else t[a]=t1[0]-'0';
}
for(i[0]=0;i[0]<4;i[0]++)
{
for(i[1]=0;i[1]<4;i[1]++)
{
if(i[0]==i[1])continue;
for(i[2]=0;i[2]<4;i[2]++)
{
if(i[0]==i[2]||i[1]==i[2])continue;
for(i[3]=0;i[3]<4;i[3]++)
{
if(i[0]==i[3]||i[1]==i[3]||i[2]==i[3])continue;
if(flag)break;
def(0,(float)t[i[0]]);
}
}
}
}
if(flag)printf("Y");
else printf("N");
}
这个道题目和表达式组合问题一样的.都是运用递归的方法.
表达式组合问题
Description
不考虑运算优先级顺序的算术运算符号+、-、×,/,任意输入5个正整数a1,a2,a3,a4,a5,在相邻的两个数之间添入一个上述运算符号,构成一个算术表达式,同时给定一个正整数M,使得表达式的值恰好为M,编程求解所有可能的表达式或输出无解信息。
Input
输入第一行为五个数字均小于100,中间用空格分开,第二行为一个数m(m<=100);
Output
若有解输出所有可能的表达式,若无解输出“no answer!”
Sample Input
1 1 1 1 15
Sample Output
1+1+1+1+1=5
Source
#include <stdio.h>
double total;
double a[5];
int count=0;
char s[5];
void eva(double sum, int c)
{
int i;
if (c < 5)
{
s[c-1] ='+';
eva(sum+a[c],c+1);
s[c-1]='-';
eva(sum-a[c],c+1);
s[c-1] ='*';
eva(sum * a[c],c+1);
s[c-1]='/';
eva(sum/a[c],c+1);
}
else
{
if (sum==total)
{
for (i=0;i<5;i++){
if(i==4)
printf("%g",a[i]);
else
printf("%g%c",a[i],s[i]);
}
printf("=%g\n",total);
count++;
}
}
}
void main()
{
int i;
for (i =0;i<5;i++)
scanf("%lf", &a[i]);
scanf("%lf", &total);
eva(a[0], 1);
if (!count)
printf("no answer!\n");
}
测试:
1 2 3 4 5
6
结果:
1-2*3+4+5=6
1*2+3-4+5=6
Press any key to continue