24h購物| | PChome| 登入
2009-08-28 19:02:53| 人氣1,199| 回應0 | 上一篇 | 下一篇

ACM 10285 Q10285: Longest Run on a Snowboard

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

作法 : DFS 搜尋

在此提供兩種作法 : (1)由大往小走 (2)由小往大走

大家一定認為這兩者沒有差別,但是所能提供的判斷就是不同...(應該吧)

最快的為第2程式碼.

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

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int map[102][102]={0};
int max;
int t,n,m;
long long int input()  
{  
  char cha;  
  unsigned long long int x=0;  
  while(cha=getchar())  
     if(cha!=' '&&cha!='\n') break;  
  x=cha-48;  
  while(cha=getchar())   
    {  
     if(cha==' '||cha=='\n') break;  
      x=x*10+cha-48;  
    }  
    return x;  
}
void DFS (int x,int y,int s)
{
   if(s>max) max=s;
   if(map[x+1][y]<map[x][y]&&x+1<=n&&map[x+1][y]+s>=max)
       DFS(x+1,y,s+1);
   if(map[x-1][y]<map[x][y]&&x-1>0&&map[x-1][y]+s>=max)
       DFS(x-1,y,s+1);
   if(map[x][y+1]<map[x][y]&&y+1<=m&&map[x][y+1]+s>=max)
       DFS(x,y+1,s+1);
   if(map[x][y-1]<map[x][y]&&y-1>0&&map[x][y-1]+s>=max)
       DFS(x,y-1,s+1);
}
main()
{
  char name[100];
  scanf("%d",&t);
  while(t--)
     {
        scanf("%s %d %d",name,&n,&m);
        int a,b,c;
        max=0;
        for(a=1;a<=n;a++)
           for(b=1;b<=m;b++)
              map[a][b]=input();
        for(a=1;a<=n;a++)
           for(b=1;b<=m;b++)
              if(map[a][b]>max)
                    DFS(a,b,1);
         printf("%s: %d\n",name,max);         
     }
 return 0;
}

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

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int map[102][102]={0},path[102][102]={0};
int max;
int t,n,m,temp;
int input()     
{     
  char cha;     
  int x=0;     
  while(cha=getchar())     
     if(cha!=' '&&cha!='\n') break;     
  x=cha-48;     
  while(cha=getchar())      
    {     
     if(cha==' '||cha=='\n') break;     
      x=x*10+cha-48;     
    }     
    return x;     
}  
void DFS (int x,int y,int s)
{
   if(s>temp) temp=s;
   if(map[x+1][y]>map[x][y]&&x+1<=n&&path[x+1][y]<=s)
       {
        path[x+1][y]=s+1;
        DFS(x+1,y,s+1);
       }
   if(map[x-1][y]>map[x][y]&&x-1>0&&path[x-1][y]<=s)
       {
        path[x-1][y]=s+1;
        DFS(x-1,y,s+1);
       }
   if(map[x][y+1]>map[x][y]&&y+1<=m&&path[x][y+1]<=s)
       {
        path[x][y+1]=s+1;
        DFS(x,y+1,s+1);
       }
   if(map[x][y-1]>map[x][y]&&y-1>0&&path[x][y-1]<=s)
       {
        path[x][y-1]=s+1;
        DFS(x,y-1,s+1);
       }
}
main()
{
  char name[100];

  scanf("%d",&t);
  while(t--)
     {
        scanf("%s %d %d",name,&n,&m);
        int a,b,c;
        max=0;
        for(a=1;a<=n;a++)
           for(b=1;b<=m;b++)
              {
              map[a][b]=input();
              path[a][b]=0;
              }
        for(a=1;a<=n;a++)
           for(b=1;b<=m;b++)
              if(path[a][b]==0)
                  {
                    temp=0;
                    DFS(a,b,1);
                    if(temp>max) max=temp;
                  } 
         printf("%s: %d\n",name,max);         
     }
 return 0;
}

台長: 來源不明
人氣(1,199) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ACM |
此分類下一篇:ACM 10400 Q10400: Game Show Math
此分類上一篇:ACM 147 Q147: Dollars

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