zoukankan      html  css  js  c++  java
  • hdu 1254 推箱子游戏

    这个题目我就不说,链接在这里http://acm.hdu.edu.cn/showproblem.php?pid=1254

    主要我想说的是,一开始是我用2个三围数组来分别标记人和箱子走过的四个方向,但不知怎么回事行不通。。。

    于是就用一个四维数组来标记状态,嘻嘻,过了。。。

    好吧,还是直接上代码了。。。。

     1 #include<iostream>
     2 #include<cstring>
     3 #include<queue>
     4 
     5 using namespace std;
     6 int visited[8][8][8][8];//记录人和箱子的状态
     7 int map[8][8];
     8 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//上、下、左、右
     9 int m,n;
    10 int px,py,sx,sy,ex,ey;
    11 
    12 struct point {
    13     int x,y; //人的位置
    14     int bx,by;  //箱子的位置
    15     int step;
    16     bool operator <(const point &p) const {
    17         return p.step<step;
    18     }
    19 };
    20 
    21 void bfs(int x,int y){
    22     priority_queue<point>Q;  
    23     point s;
    24     s.x=x,s.y=y,s.bx=sx,s.by=sy,s.step=0;
    25     Q.push(s);
    26     while(!Q.empty()){
    27         point p;
    28         p=Q.top();
    29         Q.pop();
    30         if(p.bx==ex&&p.by==ey){
    31             printf("%d\n",p.step);
    32             return ;
    33         }
    34         for(int i=0;i<4;i++){
    35             point q;
    36             q.x=p.x+dir[i][0];
    37             q.y=p.y+dir[i][1];
    38             q.bx=p.bx;
    39             q.by=p.by;
    40             q.step=p.step;
    41             if(q.x<0||q.x>=m||q.y<0||q.y>=n)
    42                 continue;
    43             if(map[q.x][q.y]==1||visited[q.x][q.y][q.bx][q.by])
    44                 continue;
    45             //如果找到了箱子,此时要推的方向与人的方向一致
    46             if(q.x==q.bx&&q.y==q.by){
    47                 q.bx=p.bx+dir[i][0];
    48                 q.by=p.by+dir[i][1];
    49                 q.step+=1;
    50                 if(q.bx<0||q.bx>=m||q.by<0||q.by>=n)
    51                     continue;
    52                 if(visited[q.x][q.y][q.bx][q.by]||map[q.bx][q.by]==1)
    53                     continue;
    54                 visited[q.x][q.y][q.bx][q.by]=1;
    55             }
    56             Q.push(q);
    57             visited[q.x][q.y][q.bx][q.by]=1;
    58         }
    59     }
    60     printf("-1\n");
    61 }
    62     
    63 
    64 int main(){
    65     int t;
    66     scanf("%d",&t);
    67     while(t--){
    68         scanf("%d%d",&m,&n);
    69         for(int i=0;i<m;i++){
    70             for(int j=0;j<n;j++){
    71                 scanf("%d",&map[i][j]);
    72                 if(map[i][j]==2){
    73                     sx=i,sy=j;
    74                 }else if(map[i][j]==3){
    75                     ex=i,ey=j;
    76                     map[i][j]=0;
    77                 }else if(map[i][j]==4){
    78                     px=i,py=j;
    79                     map[i][j]=0;
    80                 }
    81             }
    82         }
    83         memset(visited,0,sizeof(visited));
    84         bfs(px,py);
    85     }
    86     return 0;
    87 }
    88         
  • 相关阅读:
    Ajax返回xml类型数据
    选择排序 C&&C++
    php 给app写短信验证码 使用memcache缓存验证码
    php 免费的快递查询接口快递100
    CSS字体大小设置时的参考(转)
    excel vba 打印设置(转)
    MySQL的数据类型(转)
    XMind 8 pro update 7激活办法
    张小龙2011年饭否日记
    页面静态化技术Freemarker技术的介绍及使用实例.
  • 原文地址:https://www.cnblogs.com/wally/p/2878698.html
Copyright © 2011-2022 走看看