標籤: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
- S...
- ....
- ....
- ....
- ...D
要求從S點到達D點,此時,從S到D的最短距離為s = abs ( dx - sx ) + abs ( dy - sy )。
如果地圖中出現了不能經過的障礙物:
[c-sharp] view plaincopy
- S..X
- XX.X
- ...X
- .XXX
- ...D
此時的最短距離s‘ = s + 4,為了繞開障礙,不管位移幾個點,位移的距離都是最短距離s加上一個偶數距離。
就如同上面說的矩陣,要求你從0走到0,無論你怎麼繞,永遠都是最短距離(偶數步)加上某個偶數步;要求你從1走到0,永遠只能是最短距離(奇數步)加上某個偶數步。
同時可以搜 奇偶剪枝。
|
HDU-1010-Tempter of the Bone