最少步数

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述

这有一个迷宫,有0~8行和0~8列:

1,1,1,1,1,1,1,1,1
 1,0,0,1,0,0,1,0,1
 1,0,0,1,1,0,0,0,1
 1,0,1,0,1,1,0,1,1
 1,0,0,0,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,0,0,0,1
 1,1,1,1,1,1,1,1,1

0表示道路,1表示墙。

现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?

(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)

输入
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。

输出
输出最少走几步。
样例输入
2
3 1 5 7
3 1 6 7
样例输出
12
11
代码一:写的复杂了
 #include<stdio.h>
#include<string.h>
#include<queue> using namespace std; #define N 9 int maze[N][N]={,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,};
int mazeH[N][N]; struct Node
{
int x,y,cnt; };
int dir[][]={{,},{,-},{,},{-,}};//定义方向 bool Judge(int x,int y)
{
return (x < N && x >= && y < N && y >= && !mazeH[x][y])?true:false;//如果没有超出边界,返回true,否者false } void MakeNode(int x,int y,int cnt,Node &node)
{
node.x=x;
node.y=y;
node.cnt=cnt;
mazeH[x][y]=;
} int bfs(int sX,int sY,int eX,int eY)
{
Node node,tempNode;
MakeNode(sX,sY,,node);
queue<Node> Q;
Q.push (node);
while( !Q.empty() )
{
node=Q.front();
Q.pop ();
if( node.x==eX && node.y==eY )//判断是否找到结束的那个点,如果找到了,将返回最小步数;
{
return node.cnt;
}
for(int i=;i<;++i)
{
if( Judge(node.x+dir[i][],node.y+dir[i][]) )
{
MakeNode(node.x+dir[i][],node.y+dir[i][],node.cnt+,tempNode);
Q.push (tempNode);
}
}
}
} int main()
{
int nCases;
scanf("%d",&nCases);
while( nCases-- )
{
int sX,sY,eX,eY;
scanf("%d%d%d%d",&sX,&sY,&eX,&eY);
memcpy(mazeH,maze,sizeof(maze));//把maze拷贝到mazeH中;
int ans=bfs(sX,sY,eX,eY);//bfs搜索
printf("%d\n",ans);
}
return ;
}

代码二:这个简单点

 #include<stdio.h>
#define min(x,y) x<y?x:y;
int map[][]={ ,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,, };
int x1,x2,y1,y2,m;
void dfs(int x,int y,int s)
{
if(map[x][y]) return ;
if(x==x2&&y==y2)
{
m=min(s,m);
return ;
}
s++;
map[x][y]=;
dfs(x+,y,s);
dfs(x-,y,s);
dfs(x,y+,s);
dfs(x,y-,s);
map[x][y]=;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
m=;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
dfs(x1,y1,);
printf("%d\n",m);
}
return ;
}

ny58 最小步数的更多相关文章

  1. POJ 1753 Flip Game (高斯消元 枚举自由变元求最小步数)

    题目链接 题意:4*4的黑白棋,求把棋全变白或者全变黑的最小步数. 分析:以前用状态压缩做过. 和上题差不多,唯一的不同是这个终态是黑棋或者白棋, 但是只需要把给的初态做不同的两次处理就行了. 感觉现 ...

  2. yzoi2226最小步数的详细解法

    Description - 问题描述 在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”.有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字. ...

  3. One Person Game(扩展欧几里德求最小步数)

    One Person Game Time Limit: 2 Seconds      Memory Limit: 65536 KB There is an interesting and simple ...

  4. Algorithm --> 棋盘中求出A到B的最小步数

    求出A到B的最小步数 给定象棋盘,以及位置A和B, 求出从A到B的最小步数 代码: #include <cstdio> #include <iostream> #include ...

  5. 1到n的最小步数

    1到n的最小步数 Time Limit: 1 Sec  Memory Limit: 128 MB 给你一个数n,让你求从1到n的最小步数是多少. 对于当前的数x有三种操作: 1:  x+1 2:  x ...

  6. [leetcode]45. Jump Game II青蛙跳(跳到终点最小步数)

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  7. ZOJ 3593 One Person Game(拓展欧几里得求最小步数)

    One Person Game Time Limit: 2 Seconds      Memory Limit: 65536 KB There is an interesting and simple ...

  8. 带你学习BFS最小步数模型

    最小步数模型 一.简介 最小步数模型和最短路模型的区别? 最短路模型:某一个点到另一个点的最短距离(坐标与坐标之间) 最小步数模型:不再是点(坐标),而是状态到另一个状态的转变 BFS难点所在(最短路 ...

  9. yzoi1109&&viojs1042最小步数的一点看法——回文数

    Description - 问题描述 有一天,雄霸传授本人风神腿法第一式:捕风捉影..............的步法(弟子一:堂主,你大喘气呀.风:你给我闭嘴.)捕风捉影的关键是换气(换不好就会大喘气 ...

随机推荐

  1. C语言变量的声明位置

    标准C里面必须放在代码前面,否则出错: C++里面不一定要放在最前面,用的时候声明也不迟: 所以要看具体的编译环境,如果是C的话必须放在最前,C++就不用:一般.c后缀的是C文件,按C来编译:.cpp ...

  2. Linux 指令详解 alias 设置别名(转)

    我们在使用Linux中使用较长的命令而且要经常要使用时,总是会使用别名,这里就简单的介绍一下别名alias 指令:alias设置指令的别名 语法:#  alias name='command line ...

  3. XML 文档结构必须从头至尾包含在同一个实体内

      XML 文档结构必须从头至尾包含在同一个实体内 CreateTime--2018年4月2日16:40:58 Author:Marydon 问题还原: <![CDATA[ <?xml v ...

  4. 用openssl生成SSL使用的私钥和证书,并自己做CA签名(转)

    本 文记叙的是一次基于SSL的socket通讯程序开发中,有关证书,签名,身份验证相关的步骤. 我们的场景下,socket服务端是java语言编写的,客户端是c语言.使用了一个叫做matrixssl的 ...

  5. Java多线程中run(), start(), join(), wait(), yield(), sleep()的使用

    Run 每个Thread中需要实现的方法, 如果直接调用的话, 会是和单线程一样的效果, 要另起线程需要使用start(). start 新起线程调用run(). 主线程不等待直接往下执行 Yield ...

  6. 微信小程序的POST和GET请求方式的header区别

    1.post请求: wx.request({ url: 'https://m.***.com/index.php/Home/Xiaoxxf/make_order', header: { "C ...

  7. ASP.NET DataBase

    //数据库操作 public class DataBase { private SqlConnection conn;//数据库连接对象 #region 打开数据库连接 private void Op ...

  8. Ubuntu12.04设置屏幕分辨率

    Ubuntu屏幕分辨率设置 Table of Contents 1 概述 2 设置前 3 设置 4 参考 1 概述 我的Ubuntu12.04不知道被我怎么折腾了一番,屏幕的分辨率错乱了,没有办法找到 ...

  9. 【C++】const成员函数

    形式: 在成员函数后面加上const限定词,表示不会修改对象内容. 例如Circle类: class Circle { double r; public: Circle(double newr) { ...

  10. Chrome浏览器桌面通知提示功能使用

    http://www.cnblogs.com/meteoric_cry/archive/2012/03/31/2426256.html