uestc 一个简单的迷宫问题

我不知道化成网格线什么意思啊。。。 :(

如果我写一步一搜的话肯定很麻烦。。

大牛代码  理解以上两点之后再重新做。。sigh~

  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <queue>
  4 #include <string.h>
  5 using namespace std;
  6 int n,m;
  7 int map[55][55];
  8 bool vis[4][55][55];
  9 struct node
 10 {
 11     int x,y;
 12     int dr;   //方向
 13     int step;
 14     bool operator<(const node &t)const
 15     {
 16         return t.step<step;
 17     }
 18 }S,E;
 19 bool judge(int x,int y)
 20 {
 21     if(x>=0 && x<n-1 && y>=0 && y<m-1)
 22     {
 23         return true;
 24     }
 25     return false;
 26 }
 27 int bfs()
 28 {
 29     priority_queue<node>q;
 30     q.push(S);
 31     node now,next,temp;
 32     memset(vis, false, sizeof(vis));
 33     vis[S.dr][S.x][S.y]=true;
 34     while (!q.empty())
 35     {
 36        next=now=temp=q.top();
 37         q.pop();
 38         if(now.x==E.x && now.y==E.y)
 39         {
 40             return now.step;
 41         }
 42         for (int i=-1; i<4; i++)
 43         {
 44             if(i<=0)
 45             {
 46                 now.step=temp.step+1;
 47                 if(i==-1)
 48                 {
 49                     now.dr=(1+temp.dr)%4;  //右转
 50                 }
 51                 if(i==0)
 52                 {
 53                     now.dr=(3+temp.dr)%4;  //左转
 54                 }
 55                 if(!vis[now.dr][now.x][now.y])
 56                 {
 57                     vis[now.dr][now.x][now.y]=true;
 58                     q.push(now);
 59                 }
 60             }
 61             else
 62             {
 63                 next.step=temp.step+1;
 64                 if(next.dr==0)  //向上走
 65                 {
 66                     next.x=temp.x-i;
 67                 }
 68                 if(next.dr==1)  //向右走
 69                 {
 70                     next.y=temp.y+i;
 71                 }
 72                 if(next.dr==2) //向下走
 73                 {
 74                     next.x=temp.x+i;
 75                 }
 76                 if(next.dr==3) //向左走
 77                 {
 78                     next.y=temp.y-i;
 79                 }
 80                 //走i步过程中有一步走不通就不得行了
 81                 if(!judge(next.x, next.y) || map[next.x][next.y]==1)
 82                 {
 83                     break;
 84                 }
 85                 if(!vis[next.dr][next.x][next.y])
 86                 {
 87                     q.push(next);
 88                     vis[next.dr][next.x][next.y]=true;
 89                 }
 90             }
 91         }
 92     }
 93     return -1;
 94 }
 95 int main()
 96 {
 97     while (scanf("%d%d",&n,&m) && (n||m))
 98     {
 99         for (int i=0; i<n; i++)
100         {
101             for (int j=0; j<m; j++)
102             {
103                 scanf("%d",&map[i][j]);
104
105                 //把n*m的矩阵化成(n-1)*(m-1)的网格线矩阵。
106                 if(map[i][j]==1)
107                 {
108                     map[i][j]=1;
109                     if(i>=1)
110                     {
111                         map[i-1][j]=1;
112                         if(j>=1)
113                         {
114                             map[i-1][j-1]=1;
115                         }
116                     }
117                     if(j>=1)
118                     {
119                         map[i][j-1]=1;
120                         if(i>=1)
121                         {
122                             map[i-1][j-1]=1;
123                         }
124                     }
125                 }
126             }
127         }
128         scanf("%d%d%d%d%d",&S.x,&S.y,&E.x,&E.y,&S.dr);
129         S.x--,S.y--,E.x--,E.y--;
130         S.step=0;
131         printf("%d\n",bfs());
132     }
133     return 0;
134 }
时间: 2024-10-15 04:08:34

uestc 一个简单的迷宫问题的相关文章

实现简单的迷宫

我们知道栈的特点是:后进先出(First In Last Out);也就是说只能在栈的尾部进 行压栈和出栈,而且出栈的时候只能从最后一个数据开始.   所以我们利用栈这个特点,来实现这个迷宫.在这之中我们要采用"回溯"的方法去处理当遇到路径不通的情况.   原理:每找到一个通路,就将这个数据压栈,这样当前位置的上一个位置就位于栈的顶部,假如当前位置的上下左右都找不到通路的时候,就开始回溯,也就是开始从来的路往回走,而之前走过的路都存在栈里面,所以只需要一个一个的Pop就能依次往回退,每

Android apps浅析01-Amazed:一个简单但令人上瘾的加速度为基础的大理石指导游戏。

Android apps浅析01-Amazed:一个简单但令人上瘾的加速度为基础的大理石指导游戏. 这个例子中只有4个类,一个绘制大理石类Marble,一个绘制迷宫类Maze,一个Amazed视图类,一个Amazed活动类 1. 绘制大理石类Marble通过Canvas和Paint绘制,同时提供移动x轴和y轴坐标的方法,每个大理石都有一个状态值:活的/死的 /* * Copyright (C) 2008 Jason Tomlinson. * * Licensed under the Apache

一个简单的主机管理模拟程序

最近写的一个小练习,主要是把前面学的东西整合一下.写了一个简单的主机管理界面,主要是练习以下知识点: Session和Cookie进行登录验证(装饰器) 数据库的基本操作 (单表,1对多,多对多) Form的简单使用实现验证 Bootstrap模板写个简单界面 自定义分页 信号,中间件,CSRF,模板语言,JavaScript,AJAX等等 界面比较low,毕竟不是专业的. 附件里面是Django的源代码,3个文件放在一起winrar解压就可以打开

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)

[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Windows 操作系统中,利用微软 Visual Studio 2005 编译生成 Libevent 2.0.10 静态链接库,并利用 Libevent 静态链接库,实现一个简单的 HTTP Web服务器程序:httpd.exe. 假设 Visual Studio 2005 的安装路径为“D:\Program

完成一个简单的时间片轮转多道程序内核代码

王康 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 " 分别是1 存储程序计算机工作模型,cpu执行程序的基础流程: 2 函数调用堆栈:各种寄存器和存储主要是为了指令的传取值,通过eip,esp,eax,ebp和程序内存的分区,搭配push pop call return leave等一系列指令完成函数调用操作. 3 中断:多道批程序! 在复习一下上一讲的几个重要指令

一个简单的税利计算器(网页版)

嗯嗯,做一个简单的网页版的税率计算器,功能比较简单,但是相对比较实用.因为参考了一些其他作品,所以在计算汇率的时候习惯性的是以美元做单位.具体的功能有着较为详细的标注.仅供大家学习参考下. <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>JavaScript Loan Calculator</title>

利用JSP编程技术实现一个简单的购物车程序

实验二   JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP中数据库编程方法: 二.实验要求 : 利用JSP编程技术实现一个简单的购物车程序,具体要求如下. (1)用JSP编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息. (2)编写一个JSP程序来处理用户提交的登录信息,如果用户名为本小组成员的名字且密码为对应的学号时,采用J

用L脚本语言开发一个简单的局域网聊天程序

#scp #这是一个简单的局域网聊天程序的例子 定义:字符串,string1 定义:字符串,string2 #addr1是对方的地址 #addr2是自己的地址 #如果addr1和addr2相同,就是自己和自己聊天 定义:地址,addr1,127.0.0.1,27015 定义:地址,addr2,127.0.0.1,27015 定义:整数,字节数,0 #在自己的UDP端口上监听 定义:网络连接,conn2,UDP 监听:conn2,addr2 #连接对方的UDP端口 定义:网络连接,conn1,UD

一个简单的Qt程序分析

本文概要:通过一个简单的Qt程序来介绍Qt程序编写的基本框架与一些Qt程序中常见的概念 #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton *button = new QPushButton("Quit"); QObject::connect(button, SIGNA