博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
闯迷宫
阅读量:7237 次
发布时间:2019-06-29

本文共 2462 字,大约阅读时间需要 8 分钟。

题目

题目描述:sun所在学校每年都要举行电脑节,今年电脑节有一个新的趣味比赛项目叫做闯迷宫。sun的室友在帮电脑节设计迷宫,所以室友就请sun帮忙计算下走出迷宫的最少步数。知道了最少步数就可以辅助控制比赛难度以及去掉一些没有路径到达终点的map。比赛规则是:从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走。输入:输入有多组数据。每组数据输入n(0
<=100),然后输入n*n的01矩阵,0代表该格子没有障碍,为1表示有障碍物。注意:如果输入中的原点和终点为1则这个迷宫是不可达的。输出:对每组输入输出该迷宫的最短步数,若不能到达则输出-1。样例输入:20 10 050 0 0 0 01 0 1 0 10 0 0 0 00 1 1 1 01 0 1 0 0样例输出:28

思路

  • 简单的bfs题目,二维方向上对广度优先搜索的考察
  • 注意剪枝法的使用,防止重复访问

AC代码

#include 
#include
#include
struct node{ int x, y, step;}; struct queue{ struct node data[10010]; int front, rear, count;}; int dire[4][2] = {
{0, 1}, {0, -1}, {1, 0}, {-1, 0}};int maze[110][110]; void enqueue(struct queue *Q, struct node p);struct node dequeue(struct queue *Q);int bfs(int n); int main(){ int n, i, j; while (scanf("%d", &n) != EOF) { // 接受迷宫数据 for (i = 0; i < n; i ++) { for (j = 0; j < n; j ++) { scanf("%d", &maze[i][j]); } } // 处理异常情况 if (maze[0][0]) { printf("-1\n"); }else if (maze[n - 1][n - 1]) { printf("-1\n"); }else { printf("%d\n", bfs(n)); } } return 0;} void enqueue(struct queue *Q, struct node p){ Q->data[Q->rear] = p; Q->rear += 1; Q->count += 1;} struct node dequeue(struct queue *Q){ struct node p; p = Q->data[Q->front]; Q->front += 1; Q->count -= 1; return p;} int bfs(int n){ int i, tx, ty, tt; struct node s, u, q; // 初始化队列 struct queue *Q = (struct queue*)malloc(sizeof(struct queue)); Q->front = Q->rear = Q->count = 0; // 首元素入队列 s.x = s.y = s.step = 0; maze[0][0] = 1; enqueue(Q, s); while (Q->count > 0) { u = dequeue(Q); if (u.x == n - 1 && u.y == n - 1) { return u.step; } for (i = 0; i < 4; i ++) { tx = u.x + dire[i][0]; ty = u.y + dire[i][1]; tt = u.step + 1; if (tx >= 0 && ty >= 0 && tx < n && ty < n && maze[tx][ty] == 0) { maze[tx][ty] = 1; q.x = tx; q.y = ty; q.step = tt; enqueue(Q, q); } } } return -1;}/************************************************************** Problem: 1335 User: wangzhengyi Language: C Result: Accepted Time:150 ms Memory:3304 kb****************************************************************/

 

转载地址:http://ktofm.baihongyu.com/

你可能感兴趣的文章
Redis源代码分析(三十五)--- redis.c服务端的实现分析(2)
查看>>
PV(访问量)、UV(独立访客)、IP(独立IP) (转)
查看>>
docker数据拷贝
查看>>
shiro realm 注解失败问题解决过程
查看>>
iOS 静态库,动态库与 Framework 浅析
查看>>
Java对ArrayList进行排序
查看>>
NumberFormat
查看>>
Spring WebSocket初探1 (Spring WebSocket入门教程)<转>
查看>>
winform按钮和子按钮
查看>>
Hadoop HDFS编程 API入门系列之合并小文件到HDFS(三)
查看>>
【MyEcplise】build workspace卡死
查看>>
基于资源的权限系统-API设计
查看>>
如何区分USB 2.0 和USB 3.0插口
查看>>
排序及重复元素去重的说明,TreeSet,HashSet
查看>>
SQLServer 维护脚本分享(05)内存(Memory)
查看>>
Java代码调用Oracle的存储过程,存储函数和包
查看>>
InstallShield 2015 LimitedEdition VS2012 覆盖安装
查看>>
mongodb防火墙配置
查看>>
ensp实战之防火墙安全转发策略
查看>>
Activity和Fragment之间解耦
查看>>