简单的走迷宫,广搜求最短路径,要把坐标搞清楚。
#include<stdio.h>
#include
<string.h>
#include
<stdlib.h>
#define LEN 14
#define QLEN 100000
typedef 
struct 
{
    
int x;
    
int y;
    
int z;
}
Point;
typedef 
struct 
{
    
int f;
    
int r;
    Point 
*p;
}
Queue;
int d[6][3=
{
    
001,
    
00-1,
    
100,
    
-100,
    
010,
    
0-10
}
;
char sp[LEN][LEN][LEN];//space map
int rl[LEN][LEN][LEN];//road length
Point bg, ed;
int N;
void BFS()
{
    
int i, j;
    Point t;
    
int x, y, z;
    
int find = 0;
    Queue q;
    q.f 
= q.r = 0;
    q.p 
= (Point*)malloc(sizeof(Point) * QLEN);
    q.p[q.f] 
= bg;
    q.r
++;
    
while(q.f != q.r && !find)
    
{
        t 
= q.p[q.f];
        q.f 
= (q.f + 1% QLEN;//DeQueue
        for(i = 0; i < 6; i++)
        
{
            x 
= t.x + d[i][0];
            y 
= t.y + d[i][1];
            z 
= t.z + d[i][2];
            
if(sp[z][y][x] == 'O')//can walk
            {
                sp[z][y][x] 
= 'X';//change mp
                rl[z][y][x] = rl[t.z][t.y][t.x] + 1;//change rl
                q.p[q.r].x = x;//EnQueue
                q.p[q.r].y = y;
                q.p[q.r].z 
= z;
                q.r 
= (q.r + 1% QLEN;
            }

            
else if(sp[z][y][x] == 'E')
            
{
                rl[z][y][x] 
= rl[t.z][t.y][t.x] + 1;//change rl
                find = 1;
            }

        }

    }

    free(q.p);
}

int main()
{
    
int i, j, k, m;
    
char s1[LEN];
    
int gard = 100;
    
while(scanf("%s%d", s1, &N) == 2 && gard--)
    
{
        getchar();
        
for(i = 1; i <= N; i++)//read space map
            for(j = 1; j <= N; j++)
            
{
                
for(k = 1; k <= N; k++
                    sp[i][j][k] 
= getchar();
                getchar();
            }


        scanf(
"%d%d%d"&bg.x, &bg.y, &bg.z);//read point 
        scanf("%d%d%d"&ed.x, &ed.y, &ed.z);
        getchar();
        gets(s1);
//read END 
        
//getchar();
        bg.x += 1;
        bg.y 
+= 1;
        bg.z 
+= 1;
        ed.x 
+= 1;
        ed.y 
+= 1;
        ed.z 
+= 1;
        sp[bg.z][bg.y][bg.x] 
= 'B';
        sp[ed.z][ed.y][ed.x] 
= 'E';

        
for(i = 0; i <= N + 1; i++)//init map
            for(j = 0; j <= N + 1; j++)
            
{
                sp[i][j][
0= sp[i][j][N + 1= sp[N + 1][i][j] = '#';
                sp[
0][i][j] = sp[i][0][j] = sp[i][N +1][j] = '#'
            }


        
for(i = 0; i < LEN; i++)//init road length
            for(j = 0; j < LEN; j++)
                
for(k = 0; k < LEN; k++)
                    rl[i][j][k] 
= 0;
        BFS();
        
if(rl[ed.z][ed.y][ed.x] != 0)
            printf(
"%d %d\n", N, rl[ed.z][ed.y][ed.x]);
        
else if(bg.x == ed.x && bg.y == ed.y && bg.z == ed.z)
            printf(
"%d 0\n", N);
        
else 
            printf(
"NO ROUTE\n");
                    
    }
    
}

这道题交了很多遍一直WA,很是郁闷。刚开始以为自己的队列没有管理好,换成STL队列问题依旧,又怀疑输出格式的问题,修改后问题依旧。最后终于看到BFS()中有一个break(写在了for循环里面),这样是跳不出while的,用标志find代替break后果然AC!
想和写之间的确有很大的差距,多些代码才是硬道理。

scanf("%s",s1)读取字符串时对前面的空白符有过滤作用,并且字符串中间的空白符将被认为字符串的结束标志,空白符不会被读入
gets(s1)读取字符串时对前面和中间的空白符都没有过滤,只有换行符才会被认为是字符串的结束标志,该换行符不被认为是字符串的一部分


posted on 2012-03-04 12:54 小鼠标 阅读(211) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

随笔分类(111)

随笔档案(127)

friends

最新评论

  • 1. re: 线段树
  • 是这个样子的,所以在OJ有时候“卡住”了也不要太灰心,没准真的不是自己的原因呢。
    加油,祝你好运啦!
  • --小鼠标
  • 2. re: 线段树
  • 对于编程竞赛来说,Java所需时间一般为C/C++的两倍。合理的竞赛给Java的时间限制是给C/C++的两倍。
  • --伤心的笔
  • 3. re: poj1273--网络流
  • 过来看看你。
  • --achiberx
  • 4. re: (转)ubuntu11.10无法启动无线网络的解决方法
  • 膜拜大神。。查了一个下午资料终于在这里解决了问题。。神牛说的区域赛难道是ACM区域赛。。?
  • --Hang
  • 5. re: 快速排序、线性时间选择
  • 博主,谢谢你的文章。你的方法可以很好的处理分区基准在数组中重复的情况,书上的方法遇到这种输入会堆栈溢出。书上给出了解释但给的方法貌似不简洁。
  • --lsxqw2004

阅读排行榜