置顶结论: 有时候思路很清晰但提交两三次还是不对的时候,赶紧跳过去写下一道题,然后等会回来重新写一遍。 记住是完全重写,还要等一会换换脑子。
不要舍不得放弃 !!!…有舍才有得。。。
思路清晰,提交三遍还不对,趁早重写!!!
啊啊啊啊啊啊啊啊啊啊啊啊啊啊
快被自己蠢死了
一道bfs的题,很简单,思路都出来了
但写出代码来一直Memory Limit Exceeded
当天晚上找了一个小时都没找出错来。
十天过后的今天又是楞找楞半天没看出来,只好比这网上ac的代码一点一点查。
但思路没问题啊
咋就Memory Limit Exceeded啊啊啊啊啊
好吧,找了三个小时,提交了二十多遍的Memory Limit Exceeded,思路真的没问题,错误是在一遍一遍提交中偶然发现的。
而且不止一处,真是脑子进水了。
题目
http://poj.org/problem?id=2251
困扰了我四个小时的初次代码
#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
typedef struct node {
int z,x,y;//x<n y<m
int step;
} ty;
char Map[33][33][33];
int via[33][33][33];
int l,n,m;
int a,b,c;
ty t,d;
/*
##S..
.###.
.E#..
..#.#
.....
*/
void bfs()
{
int next[6][3] = {
{0,0,1},{0,0,-1},{0,1,0},
{0,-1,0},{1,0,0},{-1,0,0}
};
t.z = a; // 1
t.x = b; // 1
t.y = c; // 1
t.step = 0;
queue <ty> Q;
Q.push(t);
while ( !Q.empty() ) {
t = Q.front();
Q.pop();
if ( Map[t.z][t.x][t.y]=='E' ) {
cout << "Escaped in " << t.step << " minute(s)." << endl;
return ;
}
for ( int i=0; i<6; i++ ) {
d.x = t.x + next[i][0];
d.y = t.y + next[i][1];
d.z = t.z + next[i][2];
d.step = t.step + 1;
if ( d.z>=0 && d.z<l && d.x>=0 && d.x<n && d.y>=0 && d.y<m && via[d.z][d.x][d.y]==0 && Map[d.z][d.x][d.y]!='#' ) { // 1
via[d.z][d.x][d.y]==1; // 3
Q.push(d);
}
}
}
cout << "Trapped!" << endl;
}
int main()
{
int i,ii,iii;
while ( cin>>l>>n>>m ) {
if ( l==0&&n==0&&m==0 ) {
break ;
}
for ( i=0; i<l; i++ ) {
for ( ii=0; ii<n; ii++ ) {
for ( iii=0; iii<m; iii++ ) {
cin>>Map[i][ii][iii];
if ( Map[i][ii][iii]=='S' ) {
a = i;
b = ii;
c = iii;
}
}
}
}
memset(via,0,sizeof(int)); // 2
via[a][b][c] = 1;
bfs();
}
return 0;
}
第一处错误: 把坐标系换了但思路没转变过来,将xyz换成了zxy,但之后的代码又按照xyz写了。
第二处错误: sizeof(via)写成了sizeof(int),嗯W( ̄_ ̄)W。
第三处错误: via[d.z][d.x][d.y]==1; 对 写了两个等于号。。。
修改后ac的代码
#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
typedef struct node {
int z,x,y;//x<n y<m
int step;
} ty;
char Map[33][33][33];
int via[33][33][33];
int l,n,m;
int a,b,c;
ty t,d;
/*
##S..
.###.
.E#..
..#.#
.....
*/
void bfs()
{
int next[6][3] = {
{0,0,1},{0,0,-1},{0,1,0},
{0,-1,0},{1,0,0},{-1,0,0}
};
t.x = a;
t.y = b;
t.z = c;
t.step = 0;
queue <ty> Q;
Q.push(t);
while ( !Q.empty() ) {
t = Q.front();
Q.pop();
if ( Map[t.x][t.y][t.z]=='E' ) {
cout << "Escaped in " << t.step << " minute(s)." << endl;
return ;
}
if ( a[d.x][d.y][d.z]==1 ) {
}
for ( int i=0; i<6; i++ ) {
d.x = t.x + next[i][0];
d.y = t.y + next[i][1];
d.z = t.z + next[i][2];
d.step = t.step + 1;
if ( d.x>=0 && d.x<l && d.y>=0 && d.y<n && d.z>=0 && d.z<m && via[d.x][d.y][d.z]==0 && Map[d.x][d.y][d.z]!='#' ) {
via[d.x][d.y][d.z] = 1;
Q.push(d);
}
}
}
cout << "Trapped!" << endl;
}
int main()
{
int i,ii,iii;
while ( cin>>l>>n>>m ) {
if ( l==0||n==0||m==0 ) {
break ;
}
for ( i=0; i<l; i++ ) {
for ( ii=0; ii<n; ii++ ) {
for ( iii=0; iii<m; iii++ ) {
cin>>Map[i][ii][iii];
if ( Map[i][ii][iii]=='S' ) {
a = i;
b = ii;
c = iii;
}
}
}
}
memset(via,0,sizeof(via));
via[a][b][c] = 1;
bfs();
}
return 0;
}
结论有时候思路很清晰但提交就是不对的时候赶紧跳过去写下一道题,然后等会回来重新写一遍。 记住是完全重写,还要等一会换换脑子。