一道ACM题目,内存一直超限

xiaollla 2018-03-03 08:10:24
RT:http://acm.hdu.edu.cn/showproblem.php?pid=1253

以下是我的代码DFS:
#include<iostream>
#include<queue>
using namespace std;
const int MAX = 50;
int map[MAX][MAX][MAX];
bool mark[MAX][MAX][MAX];
int A, B, C, T;
struct Dot{
int a;
int b;
int c;
int t;
};
queue<Dot> Q;
void BFS(){
while (Q.empty() == false){
Dot dot = Q.front();
int a = dot.a;
int b = dot.b;
int c = dot.c;
int t = dot.t;
if (a == A - 1 && b == B - 1 && c == C - 1 && !mark[a][b][c]){
mark[a][b][c] = true;
if (t <= T)
cout << t << endl;
else
cout << -1 << endl;
return;
}
if (t > T){
cout << -1 << endl;
return;
}
mark[a][b][c] = true;
Dot temp;
if (a > 0 && !mark[a - 1][b][c] && map[a - 1][b][c] == 0){
temp.t = t + 1;
temp.a = a - 1;
temp.b = b;
temp.c = c;
Q.push(temp);
}
if (a<A-1&&!mark[a + 1][b][c] && map[a + 1][b][c] == 0){
temp.t = t + 1;
temp.a = a + 1;
temp.b = b;
temp.c = c;
Q.push(temp);
}
if (b > 0 && !mark[a][b - 1][c] && map[a][b - 1][c] == 0){
temp.t = t + 1;
temp.a = a;
temp.b = b-1;
temp.c = c;
Q.push(temp);
}
if (b<B-1&&map[a][b + 1][c] == 0 && !mark[a][b + 1][c]){
temp.t = t + 1;
temp.a = a ;
temp.b = b+1;
temp.c = c;
Q.push(temp);
}
if (c > 0 && !mark[a][b][c - 1] && map[a][b][c - 1] == 0){
temp.t = t + 1;
temp.a = a;
temp.b = b;
temp.c = c-1;
Q.push(temp);
}
if (c<C-1&&map[a][b][c + 1] == 0 && !mark[a][b][c + 1]){
temp.t = t + 1;
temp.a = a;
temp.b = b;
temp.c = c + 1;
Q.push(temp);
}
Q.pop();
}
}
int main(){
int n;
while (scanf_s("%d", &n) != EOF){
scanf_s("%d%d%d%d", &A, &B, &C, &T);
for (int i = 0; i < A; i++)
{
for (int j = 0; j < B; j++)
{
for (int k = 0; k < C; k++)
{
map[i][j][k] = 0;
// cin >> map[i][j][k];
scanf_s("%d", &map[i][j][k]);
mark[i][j][k] = 0;
}
}
}
while (!Q.empty()){
Q.pop();
}
Dot d;
d.a = 0;
d.b = 0;
d.c = 0;
d.t = 0;
map[0][0][0] = 0;
Q.push(d);
BFS();
if (!mark[A - 1][B - 1][C - 1])
cout << -1 << endl;
}
return 0;
}



然后是网上的答案:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <queue>
using namespace std;
bool mark[50][50][50];
bool m[50][50][50];
int t;
int go[][3] =
{
1, 0, 0,
-1, 0, 0,
0, 1, 0,
0, -1, 0,
0, 0, 1,
0, 0, -1
};
struct e
{
int x, y, z;
int t;
};
queue <e> q;
int bfs(int a, int b, int c)
{
while (!q.empty())
{
e now;
now = q.front();
q.pop();
if (now.t >= t) {
return -1;
}
for (int i = 0; i<6; i++)
{
int nx = now.x + go[i][0];
int ny = now.y + go[i][1];
int nz = now.z + go[i][2];
if (nx<0 || nx >= a || ny<0 || ny >= b || nz<0 || nz >= c) continue;
if (mark[nx][ny][nz] == 1) continue;
if (m[nx][ny][nz] == 1) continue;
m[nx][ny][nz] = 1;
e tmp;
tmp.x = nx;
tmp.y = ny;
tmp.z = nz;
tmp.t = now.t + 1;
if (tmp.t <t) {
q.push(tmp);
}
mark[nx][ny][nz] == 1;
if (nx == a - 1 && ny == b - 1 && nz == c - 1)
return tmp.t;
}
}
return -1;
}
int main()
{
int a, b, c;
int k;
while (scanf_s("%d", &k) != eof)
{
while (k--)
{
scanf_s("%d%d%d%d", &a, &b, &c, &t);
for (int i = 0; i<a; i++)
{
for (int j = 0; j<b; j++)
{
for (int k = 0; k<c; k++)
{
scanf_s("%d", &m[i][j][k]);
mark[i][j][k] = 0;
}
}
}
while (!q.empty()) q.pop();
e tmp;
tmp.x = tmp.y = tmp.z = tmp.t = 0;
q.push(tmp);
mark[0][0][0] = 1;
int rec = bfs(a, b, c);
if (rec <= t && rec != -1) printf("%d\n", rec);
else printf("-1\n");
}
}
return 0;
}



为什么网上的可以编译,我的一直内存超限啊????
...全文
882 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaollla 2018-03-25
  • 打赏
  • 举报
回复
引用 3 楼 qq_30918465 的回复:
主要问题是楼主没有剪枝和没有取最短路径并且读取多组数据的方法出错
好的 谢谢
永远的追梦人 2018-03-03
  • 打赏
  • 举报
回复
主要问题是楼主没有剪枝和没有取最短路径并且读取多组数据的方法出错
永远的追梦人 2018-03-03
  • 打赏
  • 举报
回复
上面的回答真是不负责任,十分抱歉 #include<iostream> #include<queue> using namespace std; const int MAX = 50; bool map[MAX][MAX][MAX]; int mark[MAX][MAX][MAX]; int A, B, C, T; struct Dot{ char a; char b; char c; char t; }; queue<Dot> Q; void BFS(){ while (!Q.empty()){ Dot dot = Q.front(); int a = dot.a; int b = dot.b; int c = dot.c; int t = dot.t; if (a == A - 1 && b == B - 1 && c == C - 1 && t<=T){ T=t; } if (t+A+B+C-a-b-c-3 > T){ Q.pop(); continue; } Dot temp; if (a > 0 && mark[a - 1][b][c]>t+1 && map[a - 1][b][c] == 0){ mark[a - 1][b][c]=t+1; temp.t = t + 1; temp.a = a - 1; temp.b = b; temp.c = c; Q.push(temp); } if (a<A-1&&mark[a + 1][b][c]>t+1 && map[a + 1][b][c] == 0){ mark[a + 1][b][c]=t+1; temp.t = t + 1; temp.a = a + 1; temp.b = b; temp.c = c; Q.push(temp); } if (b > 0 && mark[a][b - 1][c]>t+1 && map[a][b - 1][c] == 0){ mark[a][b - 1][c]=t+1; temp.t = t + 1; temp.a = a; temp.b = b-1; temp.c = c; Q.push(temp); } if (b<B-1&&map[a][b + 1][c] == 0 && mark[a][b + 1][c]>t+1){ mark[a][b + 1][c]=t+1; temp.t = t + 1; temp.a = a ; temp.b = b+1; temp.c = c; Q.push(temp); } if (c > 0 && mark[a][b][c - 1]>t+1 && map[a][b][c - 1] == 0){ mark[a][b][c - 1]=t+1; temp.t = t + 1; temp.a = a; temp.b = b; temp.c = c-1; Q.push(temp); } if (c<C-1&&map[a][b][c + 1] == 0 && mark[a][b][c + 1]>t+1){ mark[a][b][c + 1]=t+1; temp.t = t + 1; temp.a = a; temp.b = b; temp.c = c + 1; Q.push(temp); } Q.pop(); } } int main(){ int n; scanf("%d", &n); for(int h=0;h<n;++h){ scanf("%d%d%d%d", &A, &B, &C, &T); for (int i = 0; i < A; i++) { for (int j = 0; j < B; j++) { for (int k = 0; k < C; k++) { map[i][j][k] = 0; // cin >> map[i][j][k]; scanf("%d", &map[i][j][k]); mark[i][j][k] = 1001; } } } mark[0][0][0]=0; while (!Q.empty()){ Q.pop(); } Dot d; d.a = 0; d.b = 0; d.c = 0; d.t = 0; map[0][0][0] = 0; Q.push(d); BFS(); if (mark[A - 1][B - 1][C - 1]<=T) cout << T << endl; else cout << -1 << endl; } return 0; }
永远的追梦人 2018-03-03
  • 打赏
  • 举报
回复
他开了2个bool三维数组,你开了1个bool和1个int,内存占用应该是比较高~

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧