hdu 1732 bfs

题意:推箱子游戏

代码写错居然卡内存!!

搞了两天了

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <queue>
  5
  6 using namespace std;
  7 char s[9][9];
  8 int d[4][2]={1,0,0,1,-1,0,0,-1};
  9 int n,m,tt;
 10 struct node
 11 {
 12     int x,y;
 13 };
 14 struct all
 15 {
 16     node a[4];
 17     int t;
 18 }st,ed;
 19 bool vis[8][8][8][8][8][8][8][8];
 20
 21 bool aim[9][8];
 22 bool ok(all e)
 23 {
 24     for(int i=0;i<3;i++)
 25     {
 26         if(!aim[e.a[i].x][e.a[i].y])
 27         {
 28             return false;
 29         }
 30     }
 31     return true;
 32 }
 33 queue<all> q;
 34 void bfs()
 35 {
 36     all now,next;
 37     memset(aim,false,sizeof(aim));
 38     memset(vis,false,sizeof(vis));
 39     while(!q.empty())   q.pop();
 40     q.push(st);
 41     for(int i=0;i<3;i++)
 42         aim[ed.a[i].x][ed.a[i].y]=true;
 43     while(!q.empty())
 44     {
 45         now=q.front();
 46         q.pop();
 47         if(ok(now))
 48         {
 49             printf("%d\n",now.t);
 50             return;
 51         }
 52         //printf("%d %d %d %d %d %d %d %d %d\n",now.a[3].x,now.a[3].y,now.a[0].x,now.a[0].y,now.a[1].x,now.a[1].y,now.a[2].x,now.a[2].y,now.t);
 53         if(vis[now.a[0].x][now.a[0].y][now.a[1].x][now.a[1].y][now.a[2].x][now.a[2].y][now.a[3].x][now.a[3].y])
 54             continue;
 55         vis[now.a[0].x][now.a[0].y][now.a[1].x][now.a[1].y][now.a[2].x][now.a[2].y][now.a[3].x][now.a[3].y]=true;
 56         for(int i=0;i<4;i++)
 57         {
 58             int nx=now.a[3].x+d[i][0];  //人的移动
 59             int ny=now.a[3].y+d[i][1];
 60             if(s[nx][ny]==‘#‘||nx<0||nx>=n||ny<0||ny>=m) continue;
 61             int j;
 62             for(j=0;j<3;j++)    //人撞到箱子
 63             {
 64                 if(nx==now.a[j].x&&ny==now.a[j].y)
 65                 {
 66                     break;
 67                 }
 68             }
 69             if(j>=3)    //并没有推到箱子
 70             {
 71                 next=now;
 72                 next.a[3].x=nx,next.a[3].y=ny;
 73                 next.t++;
 74                 q.push(next);
 75             }
 76             else    //推到箱子
 77             {
 78                 nx+=d[i][0],ny+=d[i][1];  //箱子移动
 79                 if(nx<0||nx>=n||ny<0||ny>=m||s[nx][ny]==‘#‘)  continue;
 80                 int k=0;
 81                 for(k=0;k<3;k++)
 82                 {
 83                     if(nx==now.a[k].x&&ny==now.a[k].y)
 84                     {
 85                         break;
 86                     }
 87                 }
 88                 if(k>=3)    //箱子旁边并没有其他箱子
 89                 {
 90                     next=now;
 91                     next.a[3].x=nx-d[i][0],next.a[3].y=ny-d[i][1];  //人的坐标
 92                     next.a[j].x=nx,next.a[j].y=ny;  //箱子坐标
 93                     next.t++;
 94                     q.push(next);
 95                 }
 96             }
 97         }
 98     }
 99     printf("-1\n");
100 }
101 int main()
102 {
103     int i,j,k;
104     #ifndef ONLINE_JUDGE
105     freopen("1.in","r",stdin);
106     #endif
107     while(scanf("%d%d",&n,&m)!=EOF)
108     {
109         int cnt1=0,cnt2=0;
110         for(i=0;i<n;i++)
111         {
112             scanf("%s",s[i]);
113             for(j=0;j<m;j++)
114             {
115                 if(s[i][j]==‘X‘)
116                 {
117                     st.a[3].x=i,st.a[3].y=j;
118                 }
119                 else if(s[i][j]==‘*‘)
120                 {
121                     st.a[cnt1].x=i,st.a[cnt1++].y=j;
122                 }
123                 else if(s[i][j]==‘@‘)
124                 {
125                     ed.a[cnt2].x=i,ed.a[cnt2++].y=j;
126                 }
127                 if(s[i][j]!=‘#‘) s[i][j]=‘.‘;
128             }
129         }
130         st.t=0;
131         bfs();
132     }
133     return 0;
134 }
时间: 2024-11-07 19:30:34

hdu 1732 bfs的相关文章

hdu 1732 Push Box

http://acm.hdu.edu.cn/showproblem.php?pid=1732 推箱子和游戏规则一样. 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <algorithm> 5 using namespace std; 6 7 char g[10][10]; 8 int n,m; 9 int sx,sy; 10 bool vis[9][9][9][9

hdu 1175 bfs 转弯题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 和之前的1728类似.就是判断转弯数,建立一个用于记录转弯数的数组.. 还有就是对于特殊情况要进行考虑,比如起点与终点相同的情况,对于本题来说是不可以消去的应该输出NO.还有就是起点或终点是零这也是不行的,因为0代表没有棋子... 还有在判断能不能走的时候要小心,对于判断条件一定要小心,不要图赶快写.. 错误的地方都写在注释中了.. 代码: // hdu 1175 bfs 转弯数 //1.起点

Saving Princess claire_(hdu 4308 bfs模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2305    Accepted Submission(s): 822 Problem Description Princess claire_ wa

HDU 1072 bfs

Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7083    Accepted Submission(s): 3409 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a tim

hdu 1252 BFS

1 /* 2 题意:给出一个m*m矩阵表示的完全图,且每个点都有自环,每条边都有一种颜色:有三个玩家ABC的三张纸片分别初始在 3 某三个位置(可以重叠),纸片可以沿着边走一步,可以走的路径的规则为:若A要走到某个点i,则A-i的颜色要和B-C的颜 4 色相同:问最少要走多少步.(题意太难懂了,看了别人的说明才弄懂了题意) 5 6 题解:BFS 7 首先初步分析题意似乎很难用图论来解决,那么就是搜索/DP/数据结构,然后从搜索方面去思考的话,就是要找状态,然 8 后初步列出所有信息,三个点得位置

hdu 4707 bfs

bfs基础算法水题 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include<queue> using namespace std; const int Max = 1e5+50; int dist[Max]; vector<int> t

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

hdu 1226 BFS + bfs记录路径

http://acm.hdu.edu.cn/showproblem.php?pid=1226 为了省空间,可以用vis数组初始化的时候初始化为-1, 发现一个BFS容易错的地方 开始一直WA在这里:就是我int tp=q.front();之后马上q.pop():了,然后才去判断是不是符合条件以break,这样就不能根据q.empty()==1认为没有找到ans 因为这里WA了 其实也可以vis[0] == -1来判断 比较不理解的是 当n==0的时候 %n==0的时候怎么处理 //#pragma

hdu 5025 BFS + 优化 广东区域赛网赛

http://acm.hdu.edu.cn/showproblem.php?pid=5025 TLE了好几次 写的时候,问题在于, 1.钥匙怎么处理 参考了他人的写法,vis[key_num][i][j],相当于将图多维化,这样就可以判重了,否则只是按照普通的BFS,钥匙数不同的时候,可以重复,这个代码难易表达出来 另外此处一个很好的优化,当cost_now<cost[key_now][x_now][y_now]的时候,才q.push(Node)  这个剪枝很好啊 2.蛇怎么处理 没蛇的话,第一