zoukankan      html  css  js  c++  java
  • hdu 2128(bfs)

    题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=2128

    思路:这题判重比较麻烦,我是这样做的:每个状态记录炸弹数目以及爆破点的坐标映射,还要有一个访问数组来标记已经取过的炸弹的位置(下次经过就不能再取了),由于要求时间最短,可以考虑优先队列。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<queue>
     6 using namespace std;
     7 struct Node {
     8     int x,y,time;
     9     bool operator < (const Node &p) const {
    10         return p.time<time;
    11     }
    12     int key;//炸药
    13     int count;//所有爆破位置的坐标的映射(有点瞎搞的味道,hd数据弱,应该也会有冲突的吧)
    14     bool visited[9][9];//记录每个状态爆破的位置,有可能重复走
    15 } st;
    16 char map[9][9];
    17 bool mark[9][9][66][2222];//标记
    18 int n,m;
    19 int dir[4][2]= {{-1,0},{1,0},{0,-1},{0,1}};
    20 int ex,ey;
    21 
    22 bool bfs() {
    23     memset(mark,false,sizeof(mark));
    24     mark[st.x][st.y][st.key][st.count]=true;
    25     Node p,q;
    26     priority_queue<Node>Q;
    27     Q.push(st);
    28     while(!Q.empty()) {
    29         p=Q.top();
    30         Q.pop();
    31         if(p.x==ex&&p.y==ey) {
    32             printf("%d\n",p.time);
    33             return true;
    34         }
    35         for(int i=0; i<4; i++) {
    36             q=p;
    37             q.x=p.x+dir[i][0];
    38             q.y=p.y+dir[i][1];
    39             q.time=p.time+1;
    40             if(q.x<1||q.x>n||q.y<1||q.y>m)continue;
    41             if(map[q.x][q.y]=='.') {
    42                 if(!mark[q.x][q.y][q.key][q.count]) {
    43                     mark[q.x][q.y][q.key][q.count]=true;
    44                     Q.push(q);
    45                 }
    46             } else if(map[q.x][q.y]=='X') {
    47                 if(!q.visited[q.x][q.y]) {
    48                     if(q.key>0) {
    49                         q.key--,q.count+=(q.x*q.y+8*(q.x+q.y));
    50                         q.time++;
    51                         q.visited[q.x][q.y]=true;
    52                         if(!mark[q.x][q.y][q.key][q.count]) {
    53                             mark[q.x][q.y][q.key][q.count]=true;
    54                             Q.push(q);
    55                         }
    56                     }
    57                 } else if(!mark[q.x][q.y][q.key][q.count]) {
    58                     mark[q.x][q.y][q.key][q.count]=true;
    59                     Q.push(q);
    60                 }
    61             } else {
    62                 if(!q.visited[q.x][q.y]) {
    63                     q.visited[q.x][q.y]=true;
    64                     q.key+=map[q.x][q.y]-'0';
    65                 }
    66                 if(!mark[q.x][q.y][q.key][q.count]) {
    67                     mark[q.x][q.y][q.key][q.count]=true;
    68                     Q.push(q);
    69                 }
    70             }
    71         }
    72     }
    73     return false;
    74 }
    75 
    76 
    77 int main() {
    78  //  freopen("1.txt","r",stdin);
    79     while(scanf("%d%d",&n,&m),(n+m)) {
    80         for(int i=1; i<=n; i++) {
    81             scanf("%s",map[i]+1);
    82             for(int j=1; j<=m; j++) {
    83                 if(map[i][j]=='S') {
    84                     map[i][j]='.';
    85                     st.x=i;
    86                     st.y=j;
    87                     st.time=st.key=st.count=0;
    88                     memset(st.visited,false,sizeof(st.visited));
    89                     st.visited[st.x][st.y]=true;
    90                 } else if(map[i][j]=='D') {
    91                     map[i][j]='.';
    92                     ex=i,ey=j;
    93                 }
    94             }
    95         }
    96         if(!bfs())puts("-1");
    97     }
    98     return 0;
    99 }
    View Code
  • 相关阅读:
    setTimeout,setInterval你不知道的…
    浏览器console的用法
    命题和命题的否定可以同时成立吗?
    Web云笔记--CSS
    dreamweaver代码提示失效
    游戏平台代表--PS4【推荐】
    Mac上好用的视频播放器有哪些?
    新浪博客“网络繁忙请稍后再试”
    人工智能成功识别“色情暴力”信息??…
    JS查错小工具-三生有幸【推荐】
  • 原文地址:https://www.cnblogs.com/wally/p/3118717.html
Copyright © 2011-2022 走看看