luogu-1236 算24点

luogu-1236 算24点

#include <cstdio>

char op[4]={'+','-','*','/'}; //+0 -1 *2 /3
int  d[3][4],m[3][2],x[3],n[3];
bool v[3][4];
bool found=false;
bool printed=false;

void dfs(int k){
if(k==4){
  if(n[2]!=24) return;
  if(x[0]%2==0 && m[0][0]<m[0][1]) return;
  if(x[1]%2==0 && m[1][0]<m[1][1]) return;
  if(x[2]%2==0 && m[2][0]<m[2][1]) return;
  found=true;
  if(printed) return;
  printed=true;
  printf("%d%c%d=%d\n%d%c%d=%d\n%d%c%d=%d\n",
    m[0][0],op[x[0]],m[0][1],n[0],
    m[1][0],op[x[1]],m[1][1],n[1],
    m[2][0],op[x[2]],m[2][1],n[2]);
  return;
}

int t=k-1;
for(int i=0;i<4-t;i++) {
  if(v[t][i]) continue;
  m[t][1]=d[t][i]; v[t][i]=true;

  for(int j=0;j<4;j++) {
    x[t]=j;
    if(j==0)      { n[t]=m[t][0]+m[t][1]; }
    else if(j==1 && m[t][0]>=m[t][1]) { n[t]=m[t][0]-m[t][1]; }
    else if(j==2) { n[t]=m[t][0]*m[t][1]; }
    else if(j==3 && m[t][1]>0 && m[t][0]%m[t][1]==0) { n[t]=m[t][0]/m[t][1]; }
    else { continue; }

    if(k==3) { dfs(k+1); continue; }
    d[k][0]=n[t];
    for(int h=0,g=1;h<4-t;h++) { if(v[t][h]) continue; d[k][g++]=d[t][h]; }
    // for(int h=0;h<4-k;h++) { printf("%d ",d[k][h]); } printf("\n");
    for(int h=0;h<4-k;h++) { m[k][0]=d[k][h]; v[k][h]=true; dfs(k+1); m[k][0]=0; v[k][h]=false; }
  }

  m[t][1]=0; v[t][i]=false;
}

}

int main(){
  for(int i=0;i<4;i++) scanf("%d",&d[0][i]);
  for(int i=0;i<4;i++) { m[0][0]=d[0][i]; v[0][i]=true; dfs(1); m[0][0]=0; v[0][i]=false; }
  if(!found) printf("No answer!\n");
  return 0;
}

猜你喜欢

转载自blog.csdn.net/Glynn/article/details/92610974