Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
128653 | 林扬泉 | 快算24点 | C++ | 解答错误 | 80 | 0 MS | 252 KB | 2142 | 2024-01-26 08:02:45 |
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> using namespace std; int a[4]={},vis[4]={},fh[4]={},a1[4]={},a2[4]={},f=0;//a用来存4个数,vis用来存该数是否访问过(参与运算过),fh存运算过程中的符号,a1存运算过程中的较大量,a2存较小量(运算结果可以不存) void check()//判断+输出过程 { for(int i=0;i<4;i++) if(a[i]==24) {f=1;break;} if(f==1) { for(int i=0;i<3;i++) { cout<<a1[i]; if(fh[i]==1) cout<<"+"<<a2[i]<<"="<<a1[i]+a2[i]<<endl; if(fh[i]==2) cout<<"-"<<a2[i]<<"="<<a1[i]-a2[i]<<endl; if(fh[i]==3) cout<<"*"<<a2[i]<<"="<<a1[i]*a2[i]<<endl; if(fh[i]==4) cout<<"/"<<a2[i]<<"="<<a1[i]/a2[i]<<endl; } exit(0); } } void dfs(int t)//t指现在还剩几个数 { if(t==1) {check();return;} if(t>1) for(int i=0;i<4;i++) if(a[i]==24) return; for(int i=0;i<4;i++) for(int j=0;j<4;j++) if(vis[j]==0&&a[i]>=a[j]&&i!=j)//两数相同必须保证两数下标不同 { a1[4-t]=a[i]; a2[4-t]=a[j];//储存运算过程(下下行也是) a[i]=a[i]+a[j]; vis[j]=1; fh[4-t]=1; if(a[i]>0&&vis[i]==0) dfs(t-1); vis[j]=0; a[i]-=a[j];//回溯(加) a1[4-t]=a[i]; a2[4-t]=a[j]; a[i]=a[i]-a[j]; vis[j]=1; fh[4-t]=2; if(a[i]>0&&vis[i]==0) dfs(t-1); vis[j]=0; a[i]+=a[j];//减 a1[4-t]=a[i]; a2[4-t]=a[j]; a[i]=a[i]*a[j]; vis[j]=1; fh[4-t]=3; if(a[i]>0&&vis[i]==0) dfs(t-1); vis[j]=0; a[i]/=a[j];//乘 if(a[i]%a[j]==0) { a1[4-t]=a[i]; a2[4-t]=a[j]; a[i]=a[i]/a[j]; vis[j]=1; fh[4-t]=4; if(a[i]>0&&vis[i]==0) dfs(t-1); vis[j]=0; a[i]*=a[j];//除 } } } int main() { int i,j,k; for(i=0;i<4;i++) cin>>a[i]; dfs(4); if(f==0) cout<<"No answer!"<<endl; return 0; }