24h購物| | PChome| 登入
2009-04-26 11:35:33| 人氣479| 回應0 | 上一篇 | 下一篇

95全國資訊學科能力決賽 4. 靈犬尋寶

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

作法:BFS
相似題目:喵喵抓老鼠(圖形走訪2D),ACM 11352 - Crazy King(圖形走訪2D),ACM 532 Dungeon Master(圖形走訪3D),ACM 315 Network(結點關係)

不多說 去看相似題目吧 那邊有附加解法

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

#include<stdio.h>
#include<stdlib.h>
main()
{
 int n;
 while(scanf("%d",&n)==1)
  {
   int map[106][106]={0},x,y;
   int a,b,c,d,startx,starty;
     for(a=0;a<=105;a++) /*建出牆壁-1 怕靈犬走出方格造成RE*/
      {
       map[0][a]=-1;map[a][0]=-1;
       map[1][a]=-1;map[a][1]=-1;
       map[2][a]=-1;map[a][2]=-1;
       map[103][a]=-1;map[a][103]=-1;
       map[104][a]=-1;map[a][104]=-1;
       map[105][a]=-1;map[a][105]=-1;
      }
    int ans=0;
    for(a=0;a<n;a++) { scanf("%d %d",&x,&y);map[x+3][y+3]=-1; }
    scanf("%d %d",&startx,&starty);
    scanf("%d %d",&x,&y); map[x+3][y+3]=-2;
    int queue[10001][2]={0},top=0;
    queue[0][0]=startx+3;queue[0][1]=starty+3;
    for(a=0;a<=top;a++) /*BFS*/
      {
       int nn=queue[a][0],mm=queue[a][1];
        if(map[nn+1][mm+3]==-2&&map[nn][mm+1]>=0) {ans+=map[nn][mm]+1;break;}
        if(map[nn-1][mm+3]==-2&&map[nn][mm+1]>=0) {ans+=map[nn][mm]+1;break;}
        if(map[nn-3][mm+1]==-2&&map[nn-1][mm]>=0) {ans+=map[nn][mm]+1;break;}
        if(map[nn-3][mm-1]==-2&&map[nn-1][mm]>=0) {ans+=map[nn][mm]+1;break;}
        if(map[nn-1][mm-3]==-2&&map[nn][mm-1]>=0) {ans+=map[nn][mm]+1;break;}
        if(map[nn+1][mm-3]==-2&&map[nn][mm-1]>=0) {ans+=map[nn][mm]+1;break;}
        if(map[nn+3][mm+1]==-2&&map[nn+1][mm]>=0) {ans+=map[nn][mm]+1;break;}
        if(map[nn+3][mm-1]==-2&&map[nn+1][mm]>=0) {ans+=map[nn][mm]+1;break;} 

        if(map[nn+1][mm+3]==0&&map[nn][mm+1]>=0) {map[nn+1][mm+3]+=map[nn][mm]+1;top++;queue[top][0]=nn+1;queue[top][1]=mm+3;}
        if(map[nn-1][mm+3]==0&&map[nn][mm+1]>=0) {map[nn-1][mm+3]+=map[nn][mm]+1;top++;queue[top][0]=nn-1;queue[top][1]=mm+3;}
        if(map[nn-3][mm+1]==0&&map[nn-1][mm]>=0) {map[nn-3][mm+1]+=map[nn][mm]+1;top++;queue[top][0]=nn-3;queue[top][1]=mm+1;}
        if(map[nn-3][mm-1]==0&&map[nn-1][mm]>=0) {map[nn-3][mm-1]+=map[nn][mm]+1;top++;queue[top][0]=nn-3;queue[top][1]=mm-1;}
        if(map[nn-1][mm-3]==0&&map[nn][mm-1]>=0) {map[nn-1][mm-3]+=map[nn][mm]+1;top++;queue[top][0]=nn-1;queue[top][1]=mm-3;}
        if(map[nn+1][mm-3]==0&&map[nn][mm-1]>=0) {map[nn+1][mm-3]+=map[nn][mm]+1;top++;queue[top][0]=nn+1;queue[top][1]=mm-3;}
        if(map[nn+3][mm+1]==0&&map[nn+1][mm]>=0) {map[nn+3][mm+1]+=map[nn][mm]+1;top++;queue[top][0]=nn+3;queue[top][1]=mm+1;}
        if(map[nn+3][mm-1]==0&&map[nn+1][mm]>=0) {map[nn+3][mm-1]+=map[nn][mm]+1;top++;queue[top][0]=nn+3;queue[top][1]=mm-1;}
      }     
    if(ans==0) printf("impossible\n") ;
    else printf("%d\n",ans);
  }
 return 0;
}

 

台長: 來源不明
人氣(479) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: 資訊競賽 |
此分類下一篇:97高市資訊學科能力競賽 3. 矩形的內部與外部
此分類上一篇:NOIP2004 提高組 2.合并果子

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