时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:1782

解决:483

题目描述:

sun所在学校每年都要举行电脑节,今年电脑节有一个新的趣味比赛项目叫做闯迷宫。

sun的室友在帮电脑节设计迷宫,所以室友就请sun帮忙计算下走出迷宫的最少步数。

知道了最少步数就可以辅助控制比赛难度以及去掉一些没有路径到达终点的map。

比赛规则是:从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走。

输入:

输入有多组数据。

每组数据输入n(0<n<=100),然后输入n*n的01矩阵,0代表该格子没有障碍,为1表示有障碍物。

注意:如果输入中的原点和终点为1则这个迷宫是不可达的。

输出:

对每组输入输出该迷宫的最短步数,若不能到达则输出-1。

样例输入:
  1. 2
  2. 0 1
  3. 0 0
  4. 5
  5. 0 0 0 0 0
  6. 1 0 1 0 1
  7. 0 0 0 0 0
  8. 0 1 1 1 0
  9. 1 0 1 0 0
样例输出:
  1. 2
  2. 8

思路:

求迷宫最少步数自然用BFS。

代码:

  1. #include <stdio.h>
  2. #include <limits.h>
  3.  
  4. #define N 100
  5. #define INF (INT_MAX/2)
  6.  
  7. typedef struct node {
  8. int x;
  9. int y;
  10. int s;
  11. int v;
  12. int d;
  13. } Point;
  14.  
  15. int n;
  16. Point p[N][N];
  17. Point *queue[N*N+1];
  18. int front, rear;
  19.  
  20. void initQueue()
  21. {
  22. front = rear = 0;
  23. }
  24.  
  25. int isEmpty()
  26. {
  27. return front == rear;
  28. }
  29.  
  30. void push(Point *p1)
  31. {
  32. queue[rear++] = p1;
  33. }
  34.  
  35. Point *pop()
  36. {
  37. return queue[front++];
  38. }
  39.  
  40. void init()
  41. {
  42. int i, j;
  43. initQueue();
  44. for (i=0; i<n; i++)
  45. {
  46. for (j=0; j<n; j++)
  47. {
  48. scanf("%d", &(p[i][j].s));
  49. p[i][j].x = i;
  50. p[i][j].y = j;
  51. p[i][j].d = INF;
  52. p[i][j].v = p[i][j].s;
  53. }
  54. }
  55. }
  56.  
  57. int legal(int x, int y)
  58. {
  59. return x>=0 && x<n && y>=0 && y<n;
  60. }
  61.  
  62. void BFS(Point *begin, Point *end)
  63. {
  64. int i;
  65. begin->v = 1;
  66. begin->d = 0;
  67. push(begin);
  68. int t[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
  69. while (!isEmpty())
  70. {
  71. Point *p1 = pop();
  72. for (i=0; i<4; i++)
  73. {
  74. int nx = p1->x + t[i][0];
  75. int ny = p1->y + t[i][1];
  76. if (legal(nx, ny) && !p[nx][ny].v)
  77. {
  78. Point *np = &p[nx][ny];
  79. np->v = 1;
  80. np->d = p1->d + 1;
  81. if (np == end)
  82. return ;
  83. push(np);
  84. }
  85. }
  86. }
  87. }
  88.  
  89. int main()
  90. {
  91. Point *begin, *end;
  92.  
  93. while(scanf("%d", &n) != EOF)
  94. {
  95. init();
  96. begin = &p[0][0];
  97. end = &p[n-1][n-1];
  98. if (begin->s == 1 || end->s == 1)
  99. {
  100. printf("-1\n");
  101. continue;
  102. }
  103. BFS(begin, end);
  104. if (end->d == INF)
  105. printf("-1\n");
  106. else
  107. printf("%d\n", end->d);
  108. }
  109. return 0;
  110. }
  111. /**************************************************************
  112. Problem: 1335
  113. User: liangrx06
  114. Language: C
  115. Result: Accepted
  116. Time:100 ms
  117. Memory:1188 kb
  118. ****************************************************************/

九度OJ 1335:闯迷宫 (BFS)的更多相关文章

  1. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  2. 九度OJ 1502 最大值最小化(JAVA)

    题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...

  3. 九度OJ,题目1089:数字反转

    题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...

  4. 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...

  5. 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...

  6. 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)

    题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述:     省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...

  7. 九度OJ 1371 最小的K个数 -- 堆排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...

  8. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  9. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

随机推荐

  1. boost/config.hpp文件详解

    简要概述 今天突发奇想想看一下boost/config.hpp的内部实现,以及他有哪些功能. 这个头文件都有一个类似的结构,先包含一个头文件,假设为头文件1,然后包含这个头文 件中定义的宏.对于头文件 ...

  2. 自己定义JSTL函数

    因为 jstl 函数 字符串替换不支持正則表達式 所以想用java String的 replaceAll进行替换 须要自己定义 jstl函数 首先写类 package com.salesmanb2b. ...

  3. linux:ping不通www.baidu.com

    如果某台Linux服务器ping不通域名, 如下提示: [root@localhost ~]# ping www.baidu.com ping: unknown host www.baidu.com ...

  4. 转:Hash, MAC,HMAC说明

    from: http://www.cnblogs.com/songhan/archive/2012/07/29/2613898.html Hash, MAC,HMAC Hash-MD5, SHA-1, ...

  5. POJ 2503-Babelfish(map)

    题目地址:POJ 2503 题意:输入一个字典.字典格式为"英语 外语"的一一映射关系然后输入若干个外语单词.输出他们的 英语翻译单词,假设字典中不存在这个单词,则输出" ...

  6. Angular 学习笔记——$interpolateProvide

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  7. [脚本编程] 过云盾、D盾各种盾shell

    作者: dean <?php //过云盾.D盾各种盾shell $id = $_GET['id']; //debug echo $catid = isset($_GET['catid'])?ba ...

  8. liunx下安装第三方Python(PIP安装)

    wget https://pypi.python.org/packages/source/p/pip/pip-6.0.8.tar.gz $ tar zvxf pip-6.0.8.tar.gz $ cd ...

  9. 2、cas4.0 单点登录 之 cas-client

    cas4.0 单点登录 之 cas-client cas4.0 单点登录 之 https证书已经做好了证书的准备工作.如今结合cas-server来配置单点登录: 一.安装cas服务端(cas-ser ...

  10. Android EditText 输入password是否可见

    设置password不可见 etAfter.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); 设置password可见 etA ...