题意:冰球游戏,和迷宫类似,但是每一次碰到障碍则在障碍的旁边停下来,并且障碍被击碎。此时可以重新值掷一次冰球。当掷球次数超过10次则输出-1.
题解:
#include <iostream> using namespace std; #define INF 100000000 int map[21][21], dir[4][2] = { {0,-1}, {1,0}, {0,1}, {-1,0} }; int h, w, si, sj, res, step; void dfs( int x, int y ) { step++; if ( step > 10 || step >= res ) return; int a, b; for ( int i = 0; i < 4; i++ ) { a = x + dir[i][0]; b = y + dir[i][1]; if ( a >= h || a < 0 || b >= w || b < 0 || map[a][b] == 1) continue; while ( map[a][b] == 2 || map[a][b] == 0 ) { a += dir[i][0]; b += dir[i][1]; if ( a >= h || a < 0 || b >= w || b < 0 ) break; } if ( a >= h || a < 0 || b >= w || b < 0 ) continue; if ( map[a][b] == 3 ) { res = step; return; } if ( map[a][b] == 1 ) { map[a][b] = 0; dfs(a-dir[i][0],b-dir[i][1]); step--; map[a][b] = 1; } } } int main() { while ( cin >> w >> h && w && h ) { memset(map,0,sizeof(map)); for ( int i = 0; i < h; i++ ) { for ( int j = 0; j < w; j++ ) { cin >> map[i][j]; if ( map[i][j] == 2 ) { si = i; sj = j; } } } res = INF; step = 0; dfs( si, sj ); if ( res <= 10 ) cout << res << endl; else cout << -1 << endl; } return 0; }