10400 - Game Show Math------水题

来源:互联网 发布:华为机顶盒装软件 编辑:程序博客网 时间:2024/06/14 08:00
#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<set>#include<cstring>#include <algorithm>#define N 105#define MIN 1e-11#define M 32010#define MM 70000using namespace std;int a[N];int s[N];int v[N][MM];//MM粗心忘了,wa!!!int t,goal,n;char map[5]= {'+','+','-','*','/'};int flag;int dfs(int k,int cur){    if(k==n)    {        if(cur==goal)        {            printf("%d",a[0]);            for(int i=1; i<n; i++)            {                printf("%c%d",map[s[i]],a[i]);            }            printf("=%d\n",goal);            flag=0;            return 1;        }        return 0;    }    int temp=cur+a[k];    if(temp<=M&&!v[k][temp+M])//&&temp>=-M    {        v[k][temp+M]=1;        s[k]=1;        if(dfs(k+1,temp))            return 1;    }    temp=cur-a[k];    if(temp>=-M&&!v[k][temp+M])//temp<=M&&    {        v[k][temp+M]=1;        s[k]=2;        if(dfs(k+1,temp))            return 1;    }    temp=cur*a[k];    if(temp<=M&&temp>=-M&&!v[k][temp+M])    {        v[k][temp+M]=1;        s[k]=3;        if(dfs(k+1,temp))            return 1;    }    if(a[k]&&!(cur%a[k]))//    {        temp=cur/a[k];        if(temp<=M&&temp>=-M&&!v[k][temp+M])//////        {            v[k][temp+M]=1;            s[k]=4;            if(dfs(k+1,temp))                return 1;        }    }    return 0;}int main(){#ifndef ONLINE_JUDGE    freopen("ex.in","r",stdin);#endif    scanf("%d",&t);    while(t--)    {        memset(v,0,sizeof(v));        flag=1;        scanf("%d",&n);        for(int i=0; i<n; i++)            scanf("%d",&a[i]);        scanf("%d",&goal);        dfs(1,a[0]);        if(flag)            printf("NO EXPRESSION\n");    }    return 0;}

原创粉丝点击