HDOJ 1180 詭異的樓梯 DFS

2021-06-14 15:31:16 字數 1610 閱讀 3812

用dfs很容易超時,儘管題中已經考慮了剪枝,還是超了 1000ms,這題有bfs的高效解法,不過感覺時間限制太小了,1000ms就超了,上次做的題,用bfs 2000ms還能

ac啊,先上**,思路:重點考慮到達樓梯周圍四個點時候的樓梯方向和四個位置,依次列舉。

#include #include #include #include #include #include #include #include #include using namespace std;

int dis(int a,int b,int x,int y)

char maze[25][25];

bool visit[25][25],flag;

int dir[4][2] = , , , };

int stairs;

int n,m,sx,sy,endx,endy,tsum,tmin;

void dfs(int sx,int sy)

if(maze[sx+dir[i][0]][sy+dir[i][1]]=='|'||maze[sx+dir[i][0]][sy+dir[i][1]]=='-')

if(i==1)

if(i==2)

if(i==3)

} //此時到達樓梯前,樓梯方向為『-』

else if(tsum%2==1&&stairs==1 ||tsum%2==0&&stairs==0 )

if(i==1)

if(i==2)

if(i==3)}}

}}int main()

if(maze[i][j]=='|')

if(maze[i][j]=='-')

if(maze[i][j]=='t')

}} memset(visit,0,sizeof(visit));

flag=0;

tsum=0,tmin=999999;

visit[sx][sy]=1;

dfs(sx,sy);

if(flag)cout《來乙個bfs+優先佇列的解法,0ms,裡面用到的是小堆優先佇列:

#include #include #include using namespace std;

struct node ;

bool operator< ( node n1, node n2 )

int n, m;

int dir[4][2] = ;

char mp[25][25];

bool mark[25][25];

node _s;

void input()

int solve() else if( mp[q.x][q.y] == '|' ) else if( mp[q.x][q.y] == '-' )

q.x += dir[i][0];

q.y += dir[i][1];

if( isbond(q) || mark[q.x][q.y] ) continue;

q.push( q );

mark[q.x][q.y] = 1;}}

return -1;}

int main()

return 0;

}

HDU 1180 詭異的樓梯

題意 題意應該很好理解,就是從s到t的最少步數,只是加了乙個樓梯。思路 一看就是廣搜,找最少的步數,harry只能每次走到相鄰的格仔而不能斜走,每移動一次恰好為一分鐘,並且harry登上樓梯並經過樓梯到達對面的整個過程只需要一分鐘,harry從來不在樓梯上停留.並且每次樓梯都恰好在harry移動完畢...

HDU 1180 詭異的樓梯

bfs問題。題意是說爬樓梯的時候,有些樓梯是 有些是 而且每隔一分鐘就互相變化形態。只能上下,只能左右。爬樓梯的過程中,會變的樓梯不能停留,其他的可以停留。爬樓梯需要乙個單位時間,假如是 表明乙個單位時間從它左邊到它右邊或者 右邊到左邊。樓梯停留多次沒有意義,特殊樓梯只有2種旋轉狀態,多乙個wait...

hdu 1180 詭異的樓梯

要注意,雖然樓梯有時不能過,但是我們可以在樓梯前等一下,等到樓梯達到我們需要的狀態時再過,其實不用優先佇列也是可以的.具體自己去想吧.好久沒寫這麼長的 了 include include includeint m,n int tx,ty,sx,sy int visit 21 21 int dir 4...