求调,基本思路是深搜,然后现在样例他输出了个无解
  • 板块P1236 算24点
  • 楼主Tis员工
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/26 14:19
  • 上次更新2024/7/26 15:12:47
查看原帖
求调,基本思路是深搜,然后现在样例他输出了个无解
430920
Tis员工楼主2024/7/26 14:19
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
//next_permutation(a+1,a+1+n);
int a[15];
int p[5][5];
void dfs(int t,int x,int y,int z,int m){
	int b[5];
	b[1]=x;b[2]=y;b[3]=z;b[4]=m;
	if(t>=4){
		int o,d;
		for(int i=1;i<=4;i++){
			if(b[i]==114514)o++;
			if(b[i]==24)d++;
		}
		if(o==3&&d==1){
			for(int i=1;i<=3;i++){
				cout<<p[i][1];
				if(p[i][3]==1)cout<<"+";
				else if(p[i][3]==2)cout<<"-";
				else if(p[i][3]==3)cout<<"*";
				else if(p[i][3]==4)cout<<"/";
				cout<<p[i][2]<<"="<<p[i][4]<<endl;
			}
			exit(0);
		}
		return;
	}
	
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++){
			if(b[i]<b[j]||b[i]==114514||b[j]==114514)continue;
			for(int op=1;op<=4;op++){
				if(op==4&&b[i]%b[j])continue;
				if(op==2&&b[i]<=b[j])continue;
				p[t][1]=b[i];p[t][2]=b[j];p[t][3]=op;
				if(op==1)p[t][4]=b[i]+b[j];
				else if(op==2)p[t][4]=b[i]-b[j];
				else if(op==3)p[t][4]=b[i]*b[j];
				else if(op==4)p[t][4]=b[i]/b[j];
				
				int w1=b[i],w2=b[j];
				b[i]=114514;b[j]=p[t][4];
				//cout<<t<<"---"<<b[1]<<" "<<b[2]<<" "<<b[3]<<" "<<b[4]<<endl;
				dfs(t+1,b[1],b[2],b[3],b[4]);
				b[i]=w1;b[j]=w2;
			}
		}
	}
}
int main()
{
    //freopen(".in","r",stdin);freopen(".out","w",stdout);
    //ios::sync_with_stdio(false);
    for(int i=1;i<=4;i++)a[i]=read();
    dfs(1,a[1],a[2],a[3],a[4]);
	cout<<"No answer!";
	return 0;
}

求调,谢谢大佬qwq

2024/7/26 14:19
加载中...