zoukankan      html  css  js  c++  java
  • NYOJ--284--广搜+优先队列--坦克大战

    /*
        Name: NYOJ--284--坦克大战
        Author: shen_渊 
        Date: 14/04/17 19:08
        Description: 广度优先搜索+优先队列
                    注意清空地图 
                    对输入地图进行了预处理,将S,R设置为# 
    */
    
    #include<iostream> 
    #include<queue> 
    #include<cstring>
    using namespace std;
    const char YOU = 'Y';
    const char TARGET = 'T';
    const char RIVER = 'R' ;
    const char SWALL = 'S';
    const char BWALL = 'B';
    const char EMPOTY = 'E';
    const char FORBID = '#';
    struct node{
        int x,y,steps;
        node():steps(0){};
        bool operator <(const node &a)const{
            return steps>a.steps;    
        }
    }you,target;
    int bfs();
    int check(char);
    char map[305][305] = {0};
    int m,n;
    int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
    int main()
    {
    //    ios::sync_with_stdio(false);
    //    freopen("in.txt","r",stdin);
    
        while(cin>>m>>n, m || n) {
            int i,j;
            memset(map,0,sizeof(map));
            for(i=1; i<=m; ++i){
                for(j=1; j<=n; ++j){
                    cin>>map[i][j];
                    switch(map[i][j]){
                        case YOU:{
                            you.x = i;you.y = j;
                            break;
                        }
                        case TARGET:{
                            target.x = i;target.y = j;
                            break;
                        }
                        case RIVER: 
                        case SWALL:{
                            map[i][j] =='#';
                            break;
                        }    
                        default:break;
                    }
                }
            }
            cout<<bfs()<<endl;
        }
        return 0;
    }
    int bfs(){
        priority_queue<node> Q;
        while(!Q.empty())Q.pop();
        Q.push(you);
        map[you.x][you.y] = '#';
        while(!Q.empty()){
            node p = Q.top();Q.pop();
            int i,j;
            for(i=0; i<4; ++i){
                node a;
                a.x = p.x + dir[i][0];
                a.y = p.y + dir[i][1];
                if(a.x<1|| a.y<1|| a.x>m|| a.y>n)continue;
                int next;
                if(next = check(map[a.x][a.y])){
                    a.steps = p.steps + next;
                    if(a.x == target.x && a.y == target.y)return a.steps;
                    Q.push(a);
                    map[a.x][a.y] = '#';
                }
            }
        }
        return -1;
    }
    int check(char ch){
        switch(ch){
            case TARGET:return 1;
            case EMPOTY:return 1; 
            case BWALL:return 2;
        }
        return 0;
    }
  • 相关阅读:
    python2和python3的区别
    星球大战
    [USACO]高低卡(金)High Card Low Card (Gold)
    学习笔记
    叶子的染色
    大问题
    ...
    考试前...
    [HAOI2010]计数
    [POI2006]OKR-Periods of Words
  • 原文地址:https://www.cnblogs.com/langyao/p/7251888.html
Copyright © 2011-2022 走看看