南阳58--最小步数(BFS)

最少步数

时间限制: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
来源
[苗栋栋]原创
上传者
苗栋栋
 

 1 #include <queue>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 using namespace std;
 6 //int map[9][9];
 7 int ac[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
 8 struct posi
 9 {
10     int x, y, step;
11 } s, t;
12 int bfs(posi s, posi t, int map[9][9])
13 {
14     map[s.x][s.y] = 1;   //标记作用, 有判断,必有标记;
15     int i;
16     queue <posi> q;     //队列中只有一个不断更新的结构体变量;
17     s.step = 0;
18     q.push(s);
19     while(!q.empty())
20     {
21         posi n;
22         s = q.front();
23         q.pop();
24         if(s.x == t.x&& s.y == t.y)  //递归结束;
25         {
26             return s.step;
27         }
28         for(i=0; i<4; i++)
29         {
30             n.x = s.x + ac[i][0];
31             n.y = s.y + ac[i][1];
32         /*    if(map[n.x][n.y] == 0)
33             {
34                 map[n.x][n.y] = 1;
35                 //n.step = s.step + 1;
36                 q.push(n);
37
38             } */
39             if(map[n.x][n.y]==0)
40             {
41                 n.step=s.step+1;
42                 map[n.x][n.y]=1;
43                 q.push(n);
44             }
45         }
46     }
47 }
48 int main()
49 {
50     int h;
51     scanf("%d", &h);
52     while(h--)
53     {
54         int map[9][9]={
55          1,1,1,1,1,1,1,1,1,
56          1,0,0,1,0,0,1,0,1,
57           1,0,0,1,1,0,0,0,1,
58          1,0,1,0,1,1,0,1,1,
59                          1,0,0,0,0,1,0,0,1,
60                           1,1,0,1,0,1,0,0,1,
61          1,1,0,1,0,1,0,0,1,
62                          1,1,0,1,0,0,0,0,1,
63                           1,1,1,1,1,1,1,1,1,};
64         scanf("%d %d %d %d", &s.x, &s.y, &t.x, &t.y);
65         int need = bfs(s, t, map);
66         printf("%d\n", need);
67     }
68     return 0;
69 } 

时间: 2024-10-04 16:36:14

南阳58--最小步数(BFS)的相关文章

搜索学习(2)--NYOJ 58 最小步数

题目链接:click here 搜索入门题, 题意:给定一张8*8的图,给定两个坐标:起点和终点,规定0为可以走,1为墙,不能走,求出起点走到终点的最小步数. dfs的基础应用 参考代码: #include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using name

NYOJ 58 最少步数(BFS)

最少步数 描述 这有一个迷宫,有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表示墙. 现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从

NYOJ 58 最少步数 【BFS】

题意:不解释. 策略:如题: 这道题可以用深搜也可以用广搜,我以前写的是用的深搜,最近在学广搜,就拿这道题来练练手. 代码: #include<stdio.h> #include<string.h> #include<queue> using std::queue; bool vis[20][20]; const int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};//方向 int map[9][9] = { 1,1,1,1,1,1,1

nyist 58 最少步数

最少步数 时间限制: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表示墙. 现在输入一

(hdu step 4.2.4)A strange lift(求从起点到终点的最小步数,限制条件是:在一维的情况下)

题目: A strange lift Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 709 Accepted Submission(s): 348   Problem Description There is a strange lift.The lift can stop can at every floor as you want, a

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

One Person Game Time Limit: 2 Seconds      Memory Limit: 65536 KB There is an interesting and simple one person game. Suppose there is a number axis under your feet. You are at point A at first and your aim is point B. There are 6 kinds of operations

(hdu step 4.2.3)Knight Moves(求从起点是否能够到达终点的最小步数)

题目: Knight Moves Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 453 Accepted Submission(s): 326   Problem Description A friend of you is doing research on the Traveling Knight Problem (TKP) where

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

题目链接 题意:4*4的黑白棋,求把棋全变白或者全变黑的最小步数. 分析:以前用状态压缩做过. 和上题差不多,唯一的不同是这个终态是黑棋或者白棋, 但是只需要把给的初态做不同的两次处理就行了. 感觉现在还只是会套模板,不能独立的思考,好伤心.... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath&g

nyist oj 58 最少步数(dfs搜索)

最少步数 时间限制: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表示墙. 现在输入一个道路的坐标作为

yzoi2226最小步数的详细解法

Description - 问题描述 在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”.有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字.他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个(100*100)的围棋盘上任选两点A.B,A点放上黑子,B点放上白子,代表两匹马.棋子可以按“日”字走,也可以按“田”字走,俩人一个走黑马,一个走白马.谁用最少的步数走到左上角坐标为(1,1)的点时,谁获胜.现在他请你帮忙,给你A.