24点(升级版)

本24点代码可以实现以下操作:

  1. 查找4个数经过 + + +, − - , ∗ * , \ 和 ( ) () () ,运算是否可得到 N N N
  2. 支持仅查找是否存在和查找存在的算式
  3. 支持多组数据,每组数据结束后请按回车,当 N = 0 N=0 N=0时结束
  • 输入
  1. 第一行一个二进制数g,0表示不输出算式,1相反;(输入后过程中不可更改)
  2. 接下来一行一个数 N N N
  3. 然后下一行4个数,表示这些数参加运算
  4. 以回车表示下一组数据(回到第2步)
#include<bits/stdc++.h>
#define forr(i) for(int i=1;i<=4;i++)
using namespace std;
char a_c[100],b_c[100],c_c[100],d_c[100];
int a,b,c,d,a1,b1,c1,d1,N,num[4]={1,2,3,4};
bool ans;
int js(int x,int y,int n) {if(n==1)return x+y;if(n==2)return x-y;if(n==3)return x*y;if(n==4&&y!=0&&x%y==0)return x/y;return -10000000+rand();}
char w(int i){if(i==1)return '+';if(i==2)return '-';if(i==3)return '*';return '\\'; }
int g(char o[]){int x=0;for(int i=0;i<strlen(o);i++)x*=10,x+=o[i]-'0';return x;}
void comp(int &a,int &b){if(a>b)a^=b,b^=a,a^=b;return;}
void csh(){
	if(a_c[0]=='A')a=1;else if(a_c[0]=='J')a=11;else if(a_c[0]=='Q')a=12;else if(a_c[0]=='K')a=13;else a=g(a_c);
	if(b_c[0]=='A')b=1;else if(b_c[0]=='J')b=11;else if(b_c[0]=='Q')b=12;else if(b_c[0]=='K')b=13;else b=g(b_c);
	if(c_c[0]=='A')c=1;else if(c_c[0]=='J')c=11;else if(c_c[0]=='Q')c=12;else if(c_c[0]=='K')c=13;else c=g(c_c);
	if(d_c[0]=='A')d=1;else if(d_c[0]=='J')d=11;else if(d_c[0]=='Q')d=12;else if(d_c[0]=='K')d=13;else d=g(d_c);
	comp(a,b),comp(a,c),comp(a,d),comp(b,c),comp(b,d),comp(c,d);
}
void csh2(){
	if(num[0]==1)a1=a;if(num[0]==2)a1=b;if(num[0]==3)a1=c;if(num[0]==4)a1=d;
	if(num[1]==1)b1=a;if(num[1]==2)b1=b;if(num[1]==3)b1=c;if(num[1]==4)b1=d;
	if(num[2]==1)c1=a;if(num[2]==2)c1=b;if(num[2]==3)c1=c;if(num[2]==4)c1=d;
	if(num[3]==1)d1=a;if(num[3]==2)d1=b;if(num[3]==3)d1=c;if(num[3]==4)d1=d;
}
int main() {
	scanf("%d",&ans);getchar();
	system("cls");
	while(1){
		scanf("%d",&N);
		if(N==0)return 0;
		cin>>a_c>>b_c>>c_c>>d_c;getchar();csh();num[0]=1,num[1]=2,num[2]=3,num[3]=4;
		do {csh2();
			forr(i) forr(j) forr(k) {
				if(js(js(js(a1,b1,i),c1,j),d1,k)==N) {if(ans)printf("((%d%c%d)%c%d)%c%d=%d\n",a1,w(i),b1,w(j),c1,w(k),d1,N);else printf("Have answer!");goto start;}
				if(js(js(a1,js(b1,c1,i),j),d1,k)==N) {if(ans)printf("(%d%c(%d%c%d))%c%d=%d\n",a1,w(j),b1,w(i),c1,w(k),d1,N);else printf("Have answer!");goto start;}
				if(js(a1,js(js(b1,c1,i),d1,j),k)==N) {if(ans)printf("%d%c((%d%c%d)%c%d)=%d\n",a1,w(k),b1,w(i),c1,w(j),d1,N);else printf("Have answer!");goto start;}
				if(js(js(a1,b1,i),js(c1,d1,j),k)==N) {if(ans)printf("(%d%c%d)%c(%d%c%d)=%d\n",a1,w(i),b1,w(k),c1,w(j),d1,N);else printf("Have answer!");goto start;}
				if(js(a1,js(b1,js(c1,d1,i),j),k)==N) {if(ans)printf("%d%c(%d%c(%d%c%d))=%d\n",a1,w(k),b1,w(j),c1,w(i),d1,N);else printf("Have answer!");goto start;}
			}	
		} while(next_permutation(num,num+4));
		printf("No answer!\n");start:getchar();system("cls");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值