• NYOJ-最少步数


    题目网址:http://acm.nyist.net/JudgeOnline/problem.php?pid=58

    打码过程中仔细点就可以了。另外42行代码加在了最后(一轮操作执行完),

    而不是每一次函数返回都执行。

    描述

    这有一个迷宫,有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 <memory.h>
     3 int flag[10][10];
     4 int cnt[10][10];
     5 int a[10][10]={
     6  {1,1,1,1,1,1,1,1,1},
     7  {1,0,0,1,0,0,1,0,1},
     8  {1,0,0,1,1,0,0,0,1},
     9  {1,0,1,0,1,1,0,1,1},
    10  {1,0,0,0,0,1,0,0,1},
    11  {1,1,0,1,0,1,0,0,1},
    12  {1,1,0,1,0,1,0,0,1},
    13  {1,1,0,1,0,0,0,0,1},
    14  {1,1,1,1,1,1,1,1,1}
    15 };
    16 int a0,b,c,d;
    17 
    18 void init_cnt(){
    19     for (int i = 0; i < 9; i++)
    20         for (int j = 0; j < 9; j++)
    21             cnt[i][j] = 11000;
    22 }
    23 void dfs(int cur_x,int cur_y,int count){
    24     if(cur_x == c && cur_y == d){
    25         if(cnt[c][d] > count)
    26             cnt[c][d] = count;
    27         return ;
    28     }
    29     if(flag[cur_x][cur_y] || a[cur_x][cur_y])
    30         return ;
    31     flag[cur_x][cur_y] = 1;
    32     if(cnt[cur_x][cur_y] > count)
    33         cnt[cur_x][cur_y] = count;
    34     ///
    35     dfs(cur_x - 1, cur_y, count + 1);
    36     ///
    37     dfs(cur_x + 1, cur_y, count + 1);
    38     ///
    39     dfs(cur_x, cur_y - 1, count + 1);
    40     ///
    41     dfs(cur_x, cur_y + 1, count + 1);
    42     flag[cur_x][cur_y] = 0;
    43 }
    44 
    45 int main(void){
    46     int n;
    47     scanf("%d",&n);
    48     while(n--){
    49         scanf("%d%d%d%d",&a0,&b,&c,&d);
    50         for(int i = 0; i < 10; i++)
    51             memset(flag[i],0,9 * sizeof(int));
    52         init_cnt();
    53         dfs(a0,b,0);
    54         printf("%d
    ",cnt[c][d]);
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    TextField 属性与注意
    as3:获取系统信息
    转:As3 优化总结,代码写法和api使用事项。
    文本编辑器制作(1):2种方案实现
    FlashBuilder编译参数
    as3 动态类库使用
    webgame:版本更新与本地缓存
    A*
    FlashBuilder方便的调试UI插件Monster Debugger
    sourcemate flex插件
  • 原文地址:https://www.cnblogs.com/yfs123456/p/5616165.html
Copyright © 2020-2023  润新知