C语⾔简单游戏编程⼊门之算24点对给定四个1~10的正整数求解计算24点的运算过程
效果截图
c语言编程入门指南pdf/* 头⽂件引⼊ */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
/* 问题分析 */
/*
假设四个数排列顺序为 a,b,c,d
则其计算顺序总共有:
1.((a?b)?c)?d
2.(a?b)?(c?d)
3.(a?(b?c)?)d
4.a?((b?c)?d)
5.a?(b?(c?d))
其中?代表(+ - * /)中的任意⼀个运算符号
排列有24种可能,计算顺序有5种可能,运算符号有64种可能,暴⼒破解有7680种可能,远远⼩于计算机⼀秒能执⾏指令的条数
设计算法时,先遍历所有的四数排列顺序,再遍历计算顺序,最后再遍历运算符号,由于问题规模不⼤,可以通过暴⼒破解得到运算结果。*/
/* 常量定义 */
#define LENGTHARRAY 300 //数组长度
#define LENGTHANSWER 20 //答案长度
#define MIN 1e-6 //绝对值最接近0的代表数
/* 数据结构定义 */
typedef struct answer //答案结构
{
char s[LENGTHARRAY][LENGTHANSWER];//答案数组
int length;//答案数组长度
}Answer;
/* 全局变量定义 */
float number[4];//四个1~10的正整数
float nums[24][4];//排列好的四个正整数列表
char operater[4]={'+','-','*','/'};//加减乘除
Answer a;//答案数组
/
* 函数定义 */
void input();//输⼊四个正整数
void arrange();//对输⼊的四个正整数进⾏排列
float count(float n1,float n2,char op);//对两数和运算符计算
void maybe_01(float n[]);//第⼀种可能的运算顺序(1.((a?b)?c)?d )
void maybe_02(float n[]);//第⼆种可能的运算顺序(2.(a?b)?(c?d) )
void maybe_03(float n[]);//第三种可能的运算顺序(3.(a?(b?c)?)d )
void maybe_04(float n[]);//第四种可能的运算顺序(4.a?((b?c)?d) )
void maybe_05(float n[]);//第五种可能的运算顺序(5.a?(b?(c?d)) )
void getAnswer();//破解答案
void print();//输出所有答案
/
* 主函数 */
int main()
{
input();
arrange();
getAnswer();
print();
system("pause");//按任意键继续
return0;
}
/* 函数实现 */
void input()//输⼊四个正整数
printf("输⼊完毕!\n");
}
void arrange()//对输⼊的四个正整数进⾏排列(abcd,abdc,总24中可能){
printf("\n正在对四个正整数进⾏排列!\n");
int v,w,x,y;
int i=0;
for(v=0;v<4;v++)
{
for(w=0;w<4;w++)
{
for(x=0;x<4;x++)
{
for(y=0;y<4;y++)
{
if(!(v==w||v==x||v==y||w==x||w==y||x==y))
{
nums[i][0]=number[v];
nums[i][1]=number[w];
nums[i][2]=number[x];
nums[i][3]=number[y];
i++;
}
}
}
}
}
printf("排列完毕!\n");
}
float count(float n1,float n2,char op)//对两数和运算符计算
{
switch(op)
{
case'+':
return n1+n2;
break;
case'-':
return n1-n2;
break;
case'*':
return n1*n2;
break;
case'/':
if(fabs(n2-0)<MIN)
{
return1000;
}
else
{
return n1/n2;
}
break;
}
}
void maybe_01(float n[])//第⼀种可能的运算顺序(1.((a?b)?c)?d )
{
int i,j,k;
char r[20]="\0";
float one,two,three;
}
for(j=0;j<4;j++)
{
two=count(one,n[2],operater[j]);
if(fabs(two-1000)<MIN)
{
continue;
}
for(k=0;k<4;k++)
{
three=count(two,n[3],operater[k]);
if(fabs(three-24)<MIN)
{
r[0]='(';
r[1]='(';
r[2]=(int)n[0]+'0';
r[3]=operater[i];
r[4]=(int)n[1]+'0';
r[5]=')';
r[6]=operater[j];
r[7]=(int)n[2]+'0';
r[8]=')';
r[9]=operater[k];
r[10]=(int)n[3]+'0';
r[11]='\0';
flag=0;
for(m=0;m<a.length;m++)
{
if(strcmp(a.s[m],r)==0)
{
flag=1;
break;
}
}
if(flag==0)
{
m=a.length;
for(p=0;p<20;p++)
{
a.s[m][p]=r[p];
if(r[p]=='\0')
{
break;
}
}
a.length++;
}
}
}
}
}
}
void maybe_02(float n[])//第⼆种可能的运算顺序(2.(a?b)?(c?d) ){
int i,j,k;
char r[20]="\0";
float one,two,three;
}
for(j=0;j<4;j++)
{
two=count(n[2],n[3],operater[j]);
if(fabs(two-1000)<MIN)
{
continue;
}
for(k=0;k<4;k++)
{
three=count(one,two,operater[k]);
if(fabs(three-24)<MIN)
{
r[0]='(';
r[1]=(int)n[0]+'0';
r[2]=operater[i];
r[3]=(int)n[1]+'0';
r[4]=')';
r[5]=operater[k];
r[6]='(';
r[7]=(int)n[2]+'0';
r[8]=operater[j];
r[9]=(int)n[3]+'0';
r[10]=')';
r[11]='\0';
flag=0;
for(m=0;m<a.length;m++)
{
if(strcmp(a.s[m],r)==0)
{
flag=1;
break;
}
}
if(flag==0)
{
m=a.length;
for(p=0;p<20;p++)
{
a.s[m][p]=r[p];
if(r[p]=='\0')
{
break;
}
}
a.length++;
}
}
}
}
}
}
void maybe_03(float n[])//第三种可能的运算顺序(3.(a?(b?c)?)d ){
int i,j,k;
char r[20]="\0";
float one,two,three;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论