Battle City Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7085 Accepted: 2390
Description
Many of us had played the game Battle city in our childhood, and some people (like me) even often play it on computer now.Input
The input consists of several test cases. The first line of each test case contains two integers M and N (2 <= M, N <= 300). Each of the following M lines contains N uppercase letters, each of which is one of 'Y' (you), 'T' (target), 'S' (steel wall), 'B' (brick wall), 'R' (river) and 'E' (empty space). Both 'Y' and 'T' appear only once. A test case of M = N = 0 indicates the end of input, and should not be processed.Output
For each test case, please output the turns you take at least in a separate line. If you can't arrive at the target, output -1 instead.Sample Input
3 4 YBEB EERE SSTE 0 0
Sample Output
8題意:求從Y到T最少花費多長時間。
題解: 首先求最短時間,用BFS。又因為各點的權值可能不一樣,所以需要優先隊列~~
PS:第一次用STL裡的優先隊列,好方便!!!
AC代碼:
#include#include #include #define N 305 using namespace std; int n,m,sx,sy,ex,ey,visit[N][N]; int dir[][2]={ {0,1},{0,-1},{1,0},{-1,0} }; char chess[N][N]; struct Node{ int x,y,s; friend bool operator <(Node a,Node b ){ return a.s>b.s; } }; bool ok(int x,int y){ if(x>=0&&x =0&&y q; memset(visit,-1,sizeof(visit)); visit[sx][sy]=0; Node head={sx,sy,0}; q.push(head); while(!q.empty()) { Node f=q.top(); q.pop(); if(f.x==ex&&f.y==ey)return f.s; for(int i=0;i<4;i++){ int dx=f.x+dir[i][0],dy=f.y+dir[i][1]; if(ok(dx,dy)&&visit[dx][dy]){ visit[dx][dy]=0; int temp=0; if(chess[dx][dy]=='B')temp=2; else temp=1; Node tmp={dx,dy,f.s+temp}; q.push(tmp); } } } return -1; } int main() { cin.sync_with_stdio(false); while(cin>>m>>n&&(m||n)) { for(int i=0;i >chess[i][j]; if(chess[i][j]=='Y'){ sx=i;sy=j; chess[i][j]='S'; } else if(chess[i][j]=='T'){ ex=i;ey=j; } } cout<