永发信息网

C#编程问题:求24点游戏的核心算法

答案:5  悬赏:0  手机版
解决时间 2021-05-16 10:32
  • 提问者网友:绫月
  • 2021-05-15 14:43

我想用C#写一个24点游戏,但我想了很久,也想不懂其中的核心代码怎么写!我想用穷举的方法将所有的结果穷举出来,然后保存到List<string>   list_Result中去,现在就是将“*”“+”“-”“/”“(”“)”运算符和四个数随机组合的代码不会写,要将所有的结果穷举出来!

再此感谢啦!由于我没有分,不好意思啊!!

补充:在用C#写时最好加上注释,用C语言写出来也行,我可以翻译翻译、、、、

再次感谢!!!!!

最佳答案
  • 五星知识达人网友:十年萤火照君眠
  • 2021-05-15 14:56

我以前用的是C写的,你看看嘛,希望对你有帮助:
(已经调试)
#define N 20
#define COL 100
#define ROW 40
#include "stdio.h"
#include "time.h"
#include "graphics.h"
#include "alloc.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"
char p[4][13]={
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'},
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'},
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'},
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'}};
typedef struct node
{
int data;
struct node *link;
}STACK1;
typedef struct node2
{
char data;
struct node2 *link;
}STACK2;
void init(void);
void close(void);
void play(void);
void rand1(int j);
void change(char *e,char *a);
int computer(char *s);
STACK1 *initstack1(STACK1 *top);
STACK1 *push(STACK1 *top,int x);
STACK1 *pop(STACK1 *top);
int topx(STACK1 *top);
STACK1 *ptop(STACK1 *top,int *x);
int empty(STACK1 *top);
STACK2 *initstack2(STACK2 *top);
STACK2 *push2(STACK2 *top,char x);
STACK2 *pop2(STACK2 *top);
char topx2(STACK2 *top);
STACK2 *ptop2(STACK2 *top,char *x);
int empty2(STACK2 *top);
int text1(char *s) ;
main()
{
char s[N],s1[N],ch;
int i,result;
int gdriver, gmode;
clrscr();
init();
while(1)
{
setbkcolor(BLACK);
cleardevice();
play();
gotoxy(1,15);
printf("--------------------Note-------------------\n");
printf(" Please enter express accroding to above four number\n");
printf(" Format as follows:2.*(5.+7.)\n");
printf(" ----------------------------------------------\n");
scanf("%s%c",s1,&ch);
change(s1,s);
result=computer(s);
if(result==24)
text1("very good");
else
text1("wrong!!!");
printf("Continue (y/n)?\n");
scanf("%c",&ch);
if(ch=='n'||ch=='N')
break;
}
close();
return;
}
void rand1(int j)
{
int kind,num;
char str[3],n;
randomize();
while(1)
{
kind=random(4);
num=random(13);
if(p[kind][num]!=-1)
{
n=p[kind][num];
p[kind][num]=-1;
break;
}
}
switch(kind)
{
case 0:setcolor(RED);sprintf(str,"%c",3);break;
case 1:setcolor(BLACK);sprintf(str,"%c",3);break;
case 2:setcolor(RED);sprintf(str,"%c",4);break;
case 3:setcolor(BLACK);sprintf(str,"%c",5);break;
}
settextstyle(0,0,2);
outtextxy(COL+j*100-30,ROW+100-46,str);
outtextxy(COL+j*100+16,ROW+100+32,str);
if(n!='0')
{
settextstyle(0,0,3);
sprintf(str,"%c",n);
outtextxy(COL+j*100-5,ROW+100-5,str);
}
else
{
sprintf(str,"%d",10);
outtextxy(COL+j*100-6,ROW+100-5,str);
}
}
void play(void)
{
int j;
for(j=0;j<4;j++)
{
bar(COL+j*100-35,ROW+100-50,COL+j*100+35,ROW+1*100+50);
setcolor(BLUE);
rectangle(COL+j*100-32,ROW+100-48,COL+j*100+32,ROW+100+48);
rand1(j);
delay(10000);
}
}
void init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
void close(void)
{
closegraph();
}
void change(char *e,char *a)
{
STACK2 *top=NULL;
int i,j;char w;
i=0;
j=0;
while(e!='\0')
{
if(isdigit(e))
{
do{
a[j]=e;
i++;
j++;
}while(e!='.');
a[j]='.';j++;
}
if(e=='(')
top=push2(top,e);
if(e==')')
{
top=ptop2(top,&w);
while(w!='(')
{
a[j]=w;
j++;
top=ptop2(top,&w) ;
}
}
if(e=='+'||e=='-')
{
if(!empty2(top))
{
w=topx2(top);
while(w!='(')
{
a[j]=w;
j++;
top=pop2(top);
if(empty2(top))
break;
else
w=topx2(top);
}
}
top=push2(top,e);
}
if(e=='*'||e=='/')
{
if(!empty2(top))
{
w=topx2(top);
while(w=='*'||w=='/')
{
a[j]=w;
j++;
top=pop2(top);
if(empty2(top))
break;
else
w=topx2(top);
}
}
top=push2(top,e);
}
i++;
}
while(!empty2(top))
top=ptop2(top,&a[j++]);
a[j]='\0';
}
int computer(char *s)
{
STACK1 *top=NULL;
int i,k,num1,num2,result;
i=0;
while(s!='\0')
{
if(isdigit(s))
{
k=0;
do{
k=10*k+s-'0';
i++;
}while(s!='.');
top=push(top,k);
}
if(s=='+')
{
top=ptop(top,&num2);
top=ptop(top,&num1);
result=num2+num1;
top=push(top,result);
}
if(s=='-')
{
top=ptop(top,&num2);
top=ptop(top,&num1);
result=num1-num2;
top=push(top,result);
}
if(s=='*')
{
top=ptop(top,&num2);
top=ptop(top,&num1);
result=num1*num2;
top=push(top,result);
}
if(s=='/')
{
top=ptop(top,&num2);
top=ptop(top,&num1);
result=num1/num2;
top=push(top,result);
}
i++;
}
top=ptop(top,&result);
return result;
}
STACK1 *initstack1(STACK1 *top)
{
top=NULL;
return top;
}
STACK1 *push(STACK1 *top,int x)
{
STACK1 *p;
p=(STACK1 *)malloc(sizeof(STACK1));
if(p==NULL)
{
printf("memory is overflow\n!!");
exit(0);
}
p->data=x;
p->link=top;
top=p;
return top;
}
STACK1 *pop(STACK1 *top)
{
STACK1 *q;
q=top;
top=top->link;
free(q);
return top;
}
int topx(STACK1 *top)
{
if(top==NULL)
{
printf("Stack is null\n");
return 0;
}
return top->data;
}
STACK1 *ptop(STACK1 *top,int *x)
{
*x=topx(top);
top=pop(top);
return top;
}
int empty(STACK1 *top)
{
if(top==NULL)
return 1;
else
return 0;
}
STACK2 *initstack2(STACK2 *top)
{
top=NULL;
return top;
}
STACK2 *push2(STACK2 *top,char x)
{
STACK2 *p;
p=(STACK2 *)malloc(sizeof(STACK2));
if(p==NULL)
{
printf("memory is overflow\n!!");
exit(0);
}
p->data=x;
p->link=top;
top=p;
return top;
}
STACK2 *pop2(STACK2 *top)
{
STACK2 *q;
q=top;
top=top->link;
free(q);
return top;
}
char topx2(STACK2 *top)
{
if(top==NULL)
{
printf("Stack is null\n");
return '';
}
return top->data;
}
STACK2 *ptop2(STACK2 *top,char *x)
{
*x=topx2(top);
top=pop2(top);
return top;
}
int empty2(STACK2 *top)
{
if(top==NULL)
return 1;
else
return 0;
}


int text1(char *s)
{
setbkcolor(BLUE);
cleardevice();
setcolor(12);
settextstyle(1, 0, 8);
outtextxy(120, 120, s);
setusercharsize(2, 1, 4, 1);
setcolor(15);
settextstyle(3, 0, 5);
outtextxy(220, 220, s);
getch();
return ;
}

全部回答
  • 1楼网友:廢物販賣機
  • 2021-05-15 18:54

把你邮箱给我,我上学时刚好闲着无聊做了一个。感觉还不错!!

  • 2楼网友:低血压的长颈鹿
  • 2021-05-15 18:14

算法

1.  for i ← 0 to 2^n-1 2.    do F[i]←Φ; 3.  for i ← 0 to n-1 4.    do F[2^i]← {x[i]}; 5.  for x ← 1 to 2^n-1 do 6.  begin 7.    for i ← 1to x-1 do     8.    begin 9.    if x∧i=i then 10.    begin 11.    j ← x – i; 12.    if i < j 13.    then F[x] ← F[x] + comp(F[i],F[j]); 14.    end; 15.   end; 16. end;     17. return F[ 2 n ?1] ;

上述伪代码中使用了+表示集合的并运算。算法的第1~2行将F中所有的集合初始 化为空;第3~4行中 2^i 即表示只包含元素 x[i]的子集(因为 2^i 只有第 i 位 上是1),根据定义1我们知道当集合中只有一个元素的时候函数 f 的函数值就是 那唯一的元素组成的集合,所以3~4行计算出了函数 f 对于所有只有一个元素的 子集的函数值;第5~17行按照一定的顺序计算函数 f 对于 S 的所有子集的函数 值。对于 S 的两个子集 S[i] 和 S[x] , S[i]真包含于S[x]的充要条件是 x∧ i=i ,这里 ∧ 是按位进行与操作,而 x∧i=i 的必要条件是 i<x 。因而第7~15 行的循环将S[x]拆成两个子集S[i]和S[j],并在第13行根据(1.2)式计算所有的 comp( f(S[i]),f(S[j]) ) 的并。第12行的判断语句是为了优化算法的效率,因为 将 S[x]拆成两个子集 S[i]和 S[j]的过程是对称的,所以我们对于 comp( f(S[i]),f(S[j]) ) 和 comp( f(S[j]),f(S[i]) ) 两者只取一个进行计算。

如果对你有用请采纳

  • 3楼网友:刀戟声无边
  • 2021-05-15 17:50
a,b,c,d四个数,从4个数中任意抽出两个数进行计算,这样一共有6种情况! 这样四个数的运算就变为三个数的运算了! 然后从三个数任意抽出两个数进行计算,这样一共有3种情况! 这样三个数的运算就变为两个数的运算了! 接下来就不用说了吧! 只是写成程序好象挺烦的!(因为两个数之间的计算结果又有六种,这样算下来计算机一共要进行6*6*3*6*6=3888次,当然这是最不理想的情况下) 楼上那位没考虑到乘除优先法则,例如:8/(3-(8/3)) 就必须要考虑乘法法则
  • 4楼网友:老鼠爱大米
  • 2021-05-15 16:33

用枚举

1.枚举+ - * /

2.枚举计算顺序如1 2 3 4,1 2 4 3, 1 3 2 4 .....    不必枚举小括号,小括号可以在输出时加入

发现结果等于24即停止,最坏情况枚举(3*4)*4!=288次,算法时间复杂度O(1)

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯