【POJ 2312】Battle City

這是地址

題意就是精簡版的坦克大戰。。
有草地 打不壞的牆 打的壞的牆 你 和 坦克
特殊優化的BFS
其實是spfa

注意 打的壞的牆代價爲2 //打壞 + 走過去
其他的能走的都是1

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
const int MAXN = 505;
int m,n,x1,x2,y1,y2;
char h,num[MAXN][MAXN];
bool viv[MAXN][MAXN];
struct edge{
    int x,y,ans;
    bool friend operator < (edge a,edge b){
        return a.ans > b.ans;
    }
};

priority_queue < edge > q;

void init(){
    memset(num,0,sizeof(num));
    memset(viv,0,sizeof(viv));
    x1 = x2 = y1 = y2 = 0;
    return;
}

bool out(int x,int y){
    if(x < 1 || x > n || y < 0 || y >= m || num[x][y] == 'S' || num[x][y] == 'R' || viv[x][y]) return false;
    else return true;
}

int dqs(){
    while(!q.empty()) q.pop();
    q.push((edge){x1,y1,0});
    viv[x1][y1] = true;

    while(!q.empty()){
        edge u = q.top(); q.pop();
        if(u.x == x2 && u.y == y2) return u.ans;
        for(int i = 0; i < 4; i ++){
            int tx = dx[i] + u.x;
            int ty = dy[i] + u.y;
            if(!out(tx,ty)) continue;
            if(num[tx][ty] == 'B') q.push((edge){tx,ty,u.ans + 2});
            else q.push((edge){tx,ty,u.ans + 1});
            viv[tx][ty] = true;
        }
    }
    return -1;
}

int main(){
    while(scanf("%d %d",&n,&m) && m && n){
        if(m == 0 && n == 0) break; init(); 
        h = getchar();
        for(int i = 1; i <= n; i ++) gets(num[i]);
        for(int i = 1; i <= n; i ++)
            for(int j = 0; j < m; j ++){
                if(num[i][j] == 'Y') x1 = i,y1 = j;
                else if(num[i][j] == 'T') x2 = i,y2 = j;
            }

        printf("%d\n",dqs());
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章