解题思路
先全排列再枚举符号
就是一个区间劈开成两个操作再合并
代码
#include#include #include #include using namespace std; vector q[10][10]; int n,a[5],b[5],c[5]; bool p[5],ins[5][5]; void dfs(int l,int r) //求值 { ins[l][r]=1; if (l==r) { q[l][r].push_back(c[l]); return; } for (int i=l;i if (!ins[l][i]) dfs(l,i); if (!ins[i+1][r]) dfs(i+1,r); for (int j=0;j int x=q[l][i][j],y=q[i+1][r][k]; q[l][r].push_back(x+y); q[l][r].push_back(x-y); q[l][r].push_back(x*y); if (y!=0&&x%y==0) q[l][r].push_back(x/y); } } } bool check(int x) //枚举全排列 { if (x>4) { memset(ins,0,sizeof(ins)); for (int i=1;i<=4;i++) for (int j=1;j<=4;j++) q[i][j].clear(); //q存可以求出来的答案 for (int i=1;i<=4;i++) c[i]=a[b[i]]; dfs(1,4); for (int i=0;iprintf("1n"); return 1; } return 0; } for (int i=1;i<=4;i++) if (!p[i]) { p[i]=1; b[x]=i; if (check(x+1)) return 1; b[x]=0; p[i]=0; } return 0; } int main() { freopen("game.in","r",stdin); freopen("game.out","w",stdout); scanf("%d",&n); while (n--) { for (int i=1;i<5;i++) scanf("%d",&a[i]); memset(p,0,sizeof(p)); if (!check(1)) printf("0n"); } return 0; }



