HDU-1010-Tempter of the Bone

來源:互聯網
上載者:User

標籤:blog   http   io   ar   for   strong   sp   div   art   

題目連結

http://acm.hdu.edu.cn/showproblem.php?pid=1010

題目意思是講有一隻狗要吃骨頭,結果進入了一個迷宮陷阱,迷宮裡每走過一個地板費時一秒,該地板 就會在下一秒塌陷,所以你不能在該地板上逗留。迷宮裡面有一個門,只能在特定的某一秒才能開啟,讓狗逃出去。現在題目告訴你迷宮的大小和門開啟的時間,問你狗可不可以逃出去,可以就輸出YES,否則NO。

 



搜尋時要用到的剪枝:

1.如果目前時間即步數(step) >= T 而且還沒有找到D點,則剪掉。

2.設當前位置(x, y)到D點(dx, dy)的最短距離為s,到達當前位置(x, y)已經花費時間(步數)step,那麼,如果題目要求的時間T - step < s,則剪掉。

3. 對於當前位置(x, y),如果,(T-step-s)是奇數,則剪掉(奇偶剪枝)。

4.如果地圖中,可走的點的數目(xnum) < 要求的時間T,則剪掉(路徑剪枝)

 

#include<stdio.h>

#include<stdlib.h>

int n,m,ex,ey,t;

int success;

char maze[10][10];

void dfs(int stx,int sty,int dt)

{

    if(stx<=0||stx>n||sty<=0||sty>m)

    return ;

    if(stx==ex&&sty==ey&&dt==t)

    {

        success=1;

        return ;

    }

    int temp=(t-dt)-abs(ex-stx)-abs(ey-sty);

    if(temp<0||temp&1)

    return ;

    if(maze[stx][sty+1]!=‘X‘)

    {

        maze[stx][sty+1]=‘X‘;

        dfs(stx,sty+1,dt+1);

        maze[stx][sty+1]=‘.‘;

    }

    if(maze[stx][sty-1]!=‘X‘)

    {

        maze[stx][sty-1]=‘X‘;

        dfs(stx,sty-1,dt+1);

        maze[stx][sty-1]=‘.‘;

    }

    if(maze[stx+1][sty]!=‘X‘)

    {

        maze[stx+1][sty]=‘X‘;

        dfs(stx+1,sty,dt+1);

        maze[stx+1][sty]=‘.‘;

    }

    if(maze[stx-1][sty]!=‘X‘)

    {

        maze[stx-1][sty]=‘X‘;

        dfs(stx-1,sty,dt+1);

        maze[stx-1][sty]=‘.‘;

    }

}

 

int main(void)

{

    int stx,sty,wall,i,j;

    while(scanf("%d%d%d",&n,&m,&t)==3&&(n+m+t))

    {

        getchar();

        wall=0;

        for(i=1;i<=n;i++)

        {

            for(j=1;j<=m;j++)

            {

                scanf("%c",&maze[i][j]);

                if(maze[i][j]==‘S‘)

                {

                    stx=i;

                    sty=j;

                }

                else if(maze[i][j]==‘D‘)

                {

                    ex=i;

                    ey=j;

                }

                else if(maze[i][j]==‘X‘)

                wall++;

            }

            getchar();

        }

        success=0;

        maze[stx][sty]=‘X‘;

        if(n*m-wall<=t)

        printf("NO\n");

        else

        {

            dfs(stx,sty,0);

            if(success)

            printf("YES\n");

            else

            printf("NO\n");

        }

    }

    return 0;

}

 

 



 
什麼是奇偶剪枝?

把矩陣看成如下形式: 
0 1 0 1 0 1 
1 0 1 0 1 0 
0 1 0 1 0 1 
1 0 1 0 1 0 
0 1 0 1 0 1 
從為 0 的格子走一步,必然走向為 1 的格子 。
從為 1 的格子走一步,必然走向為 0 的格子 。
即: 
從 0 走向 1 必然是奇數步,從 0 走向 0 必然是偶數步。

所以當遇到從 0 走向 0 但是要求時間是奇數的或者 從 1 走向 0 但是要求時間是偶數的,都可以直接判斷不可達!

 

比如有一地圖:

 

[c-sharp] view plaincopy 
  1. S...  
  2. ....  
  3. ....  
  4. ....  
  5. ...D  

 

要求從S點到達D點,此時,從S到D的最短距離為s = abs ( dx - sx ) + abs ( dy - sy )。

如果地圖中出現了不能經過的障礙物:

 

[c-sharp] view plaincopy 
  1. S..X  
  2. XX.X  
  3. ...X  
  4. .XXX  
  5. ...D  

 

此時的最短距離s‘ = s + 4,為了繞開障礙,不管位移幾個點,位移的距離都是最短距離s加上一個偶數距離。

就如同上面說的矩陣,要求你從0走到0,無論你怎麼繞,永遠都是最短距離(偶數步)加上某個偶數步;要求你從1走到0,永遠只能是最短距離(奇數步)加上某個偶數步。

 

 

同時可以搜 奇偶剪枝。 

 

HDU-1010-Tempter of the Bone

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.