24h購物| | PChome| 登入
2009-08-28 19:05:12| 人氣667| 回應0 | 上一篇 | 下一篇

ACM 10400 Q10400: Game Show Math

推薦 0 收藏 0 轉貼0 訂閱站台

作法 : DFS

題目給的CUT,一定要用 >=32000 <=-32000 不要做

另外重複的路徑不要走.

/*******************************************************/

#include<stdio.h>
#include<stdlib.h>
int num[101]={0};
int tol[101]={0},find,goal;
int n,m,a,b,c,p;
int record[101][64001]={0};
void DFS (int now,int value)
{
   int a;
   if(find==1) return;
   if(now==p-1)
      {
         if(value==goal)
            {
             find=1;
              printf("%d",num[0]);
              for(a=0;a<p-1;a++)
                 {
                   if(tol[a]==1) printf("+");
                   if(tol[a]==2) printf("-");
                   if(tol[a]==3) printf("*");
                   if(tol[a]==4) printf("/");
                   printf("%d",num[a+1]);
                 }
              printf("=%d\n",goal);
            }
         return;
      }
   else
   for(a=1;a<=4;a++)
      {
         tol[now]=a;
         if(a==1&&value+num[now+1]<32000&&record[now+1][value+num[now+1]+32000]==0)
         {
         record[now+1][value+num[now+1]+32000]=1;
         DFS(now+1,value+num[now+1]);
         }
         else if(a==2&&value-num[now+1]>-32000&&record[now+1][value-num[now+1]+32000]==0)
         {
         record[now+1][value-num[now+1]+32000]=1;
         DFS(now+1,value-num[now+1]);
         }
         else if(a==3&&value*num[now+1]<32000&&value*num[now+1]>-32000&&record[now+1][value*num[now+1]+32000]==0)
         {
         record[now+1][value*num[now+1]+32000]=1;
         DFS(now+1,value*num[now+1]);
         }
         else if(a==4&&num[now+1]!=0&&value%num[now+1]==0&&record[now+1][value/num[now+1]+32000]==0)
         {
         record[now+1][value/num[now+1]+32000]=1;
         DFS(now+1,value/num[now+1]);
         }
      }
}
main()
{
  while(scanf("%d",&n)==1)
      while(n--)
         {
           scanf("%d",&p);
           for(a=0;a<p;a++)
              scanf("%d",&num[a]);
           for(a=0;a<p;a++)
              for(b=0;b<64000;b++)
                 record[a][b]=0;
           scanf("%d",&goal);
           find=0;
           DFS(0,num[0]);
           if(find==0)
           printf("NO EXPRESSION\n");
         }
 return 0;
}

台長: 來源不明
人氣(667) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ACM |
此分類下一篇:ACM 10976 10976 - Fractions Again?!
此分類上一篇:ACM 10285 Q10285: Longest Run on a Snowboard

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文