24h購物| | PChome| 登入
2009-08-21 23:04:03| 人氣221| 回應0 | 上一篇 | 下一篇

我飽了

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

作法 : DFS

目前沒有任何人過,所以我也不曉得此作法是否正確.

不過大致上就是利用遞迴去做探訪

不過作探訪的同時,把走過的路做上標記,並且不要走回去,而在退回的部份

要把標記刪除,才能用別的路徑通過這一點

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

#include<stdio.h>
#include<stdlib.h>
int map[30][30]={0},max=0,used[30][30]={0};
void DFS (int x,int y,int sum)
{
   if(map[x+1][y]!=-10&&used[x+1][y]==0)
      {
        if(map[x+1][y]==-11)
             {if(sum>max) max=sum;}
        else
          {
           used[x+1][y]=1;
           DFS(x+1,y,sum+map[x+1][y]);
           used[x+1][y]=0;
          }
      }
   if(map[x-1][y]!=-10&&used[x-1][y]==0)
      {
        if(map[x-1][y]==-11)
             {if(sum>max) max=sum;}
        else
          {
           used[x-1][y]=1;
           DFS(x-1,y,sum+map[x-1][y]);
           used[x-1][y]=0;
          }
      }
   if(map[x][y+1]!=-10&&used[x][y+1]==0)
      {
        if(map[x][y+1]==-11)
             {if(sum>max) max=sum;}
        else
          {
           used[x][y+1]=1;
           DFS(x,y+1,sum+map[x][y+1]);
           used[x][y+1]=0;
          }
      }
   if(map[x][y-1]!=-10&&used[x][y-1]==0)
      {
        if(map[x][y-1]==-11)
             {if(sum>max) max=sum;}
        else
          {
           used[x][y-1]=1;
           DFS(x,y-1,sum+map[x][y-1]);
           used[x][y-1]=0;
          }
      }
}
main()
{
  int a,b,c,n,m,h;
  char s[30];
  while(scanf("%d %d %d",&n,&m,&h)==3)
      {
       int startx,starty;
         for(a=0;a<n;a++)
            {
              scanf("%s",s);
              for(b=0;b<m;b++)
                 if(s[b]=='*')  map[a][b]=-10;
                 else if(s[b]=='S')  {startx=a;starty=b;}
                 else if(s[b]=='E')  map[a][b]=-11;
                 else if(s[b]<='D'&&s[b]>='A')  map[a][b]=(s[b]-'A'+1)*-1;
                 else map[a][b]=1;
            }
         used[startx][starty]=1;
         max=0;
         DFS (startx,starty,0);
         if(h==max)
            printf("OK!\n",max);
         else if(h<max)
            printf("=] %d\n",max);  
         else
            printf("=[ %d\n",max);
         used[startx][starty]=0;
      }
 return 0;
}

台長: 來源不明
人氣(221) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ZeroJudge 基礎+原創題庫 |
此分類下一篇:加減乘除問題
此分類上一篇:讀取練習——強大的加法! ﹝增強版﹞

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