• ny58 最小步数


    最少步数

    时间限制: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<stdio.h>
     2 #include<string.h>
     3 #include<queue>
     4 
     5 using namespace std;
     6 
     7 #define N 9
     8 
     9 int maze[N][N]={1,1,1,1,1,1,1,1,1,
    10 1,0,0,1,0,0,1,0,1,
    11 1,0,0,1,1,0,0,0,1,
    12 1,0,1,0,1,1,0,1,1,
    13 1,0,0,0,0,1,0,0,1,
    14 1,1,0,1,0,1,0,0,1,
    15 1,1,0,1,0,1,0,0,1,
    16 1,1,0,1,0,0,0,0,1,
    17 1,1,1,1,1,1,1,1,1};
    18 int mazeH[N][N];
    19 
    20 struct Node
    21 {
    22     int x,y,cnt;
    23 
    24 };
    25 int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//定义方向
    26 
    27 bool Judge(int x,int y)
    28 {
    29 return (x < N && x >= 0 && y < N && y >= 0 && !mazeH[x][y])?true:false;//如果没有超出边界,返回true,否者false
    30 
    31 }
    32 
    33 void MakeNode(int x,int y,int cnt,Node &node)
    34 {
    35     node.x=x;
    36     node.y=y;
    37     node.cnt=cnt;
    38     mazeH[x][y]=1;
    39 }
    40 
    41 int bfs(int sX,int sY,int eX,int eY)
    42 {
    43 Node node,tempNode;
    44 MakeNode(sX,sY,0,node);
    45 queue<Node> Q;
    46 Q.push (node);
    47      while( !Q.empty() )
    48     {
    49           node=Q.front();
    50           Q.pop ();
    51     if( node.x==eX && node.y==eY )//判断是否找到结束的那个点,如果找到了,将返回最小步数;
    52         {
    53        return node.cnt;
    54         }
    55     for(int i=0;i<4;++i)
    56        {
    57              if( Judge(node.x+dir[i][0],node.y+dir[i][1]) )
    58             {
    59            MakeNode(node.x+dir[i][0],node.y+dir[i][1],node.cnt+1,tempNode);
    60                       Q.push (tempNode);
    61             }
    62        } 
    63     }
    64 }
    65 
    66 int main()
    67 {
    68 int nCases;
    69 scanf("%d",&nCases);
    70 while( nCases-- )
    71 {
    72 int sX,sY,eX,eY;
    73 scanf("%d%d%d%d",&sX,&sY,&eX,&eY);
    74 memcpy(mazeH,maze,sizeof(maze));//把maze拷贝到mazeH中;
    75 int ans=bfs(sX,sY,eX,eY);//bfs搜索
    76 printf("%d
    ",ans);
    77 }
    78 return 0;
    79 }
    View Code

    代码二:这个简单点

     1 #include<stdio.h>
     2 #define min(x,y) x<y?x:y;
     3 int map[9][9]={ 1,1,1,1,1,1,1,1,1,
     4                 1,0,0,1,0,0,1,0,1,
     5                 1,0,0,1,1,0,0,0,1,
     6                 1,0,1,0,1,1,0,1,1,
     7                 1,0,0,0,0,1,0,0,1,
     8                 1,1,0,1,0,1,0,0,1,
     9                 1,1,0,1,0,1,0,0,1,
    10                 1,1,0,1,0,0,0,0,1,
    11                 1,1,1,1,1,1,1,1,1 };
    12 int x1,x2,y1,y2,m;
    13 void dfs(int x,int y,int s)
    14 {
    15     if(map[x][y]) return ;
    16     if(x==x2&&y==y2)
    17     {
    18         m=min(s,m);
    19         return ;
    20     }
    21     s++;
    22     map[x][y]=1;
    23     dfs(x+1,y,s);
    24     dfs(x-1,y,s);
    25     dfs(x,y+1,s);
    26     dfs(x,y-1,s);
    27     map[x][y]=0;
    28 }
    29 int main()
    30 {
    31     int n;
    32     scanf("%d",&n);
    33     while(n--)
    34     {
    35         m=100;
    36         scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    37         dfs(x1,y1,0);
    38         printf("%d
    ",m);
    39     }
    40     return 0;
    41 }
    View Code
  • 相关阅读:
    python-logging配置
    python-装饰器
    python字符串操作
    python集合
    python-列表和元组
    Python 3开发网络爬虫(四): 登录
    python3中No module named 'commands'
    Python 爬虫 (三)
    零基础自学Python 3开发网络爬虫(二): 用到的数据结构简介以及爬虫Ver1.0 alpha
    零基础自学用Python 3开发网络爬虫(一)
  • 原文地址:https://www.cnblogs.com/lovychen/p/3215211.html
Copyright © 2020-2023  润新知