| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2003 人关注过本帖
标题:请帮我解一下这道题,不会
只看楼主 加入收藏
Marshul
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-10-2
结帖率:0
收藏
 问题点数:0 回复次数:12 
请帮我解一下这道题,不会
下图是一个 n x m 的网格,你需要从你所在的位置拿到任意一本秘籍才能过关。并且只能上下左右四个方向移动,移动一个格子就算一步。
第一行有两个整数 n,m。地图是 n 行 m 列。接下来的 n 行,每行 m 个字符,其中 '.' 代表道路,'#' 代表墙,'S' 代表你所在的位置,'T' 代表通关的位置,'P'代表秘籍的位置。除了墙以外,别的地方都可以通过。你需要找到一条最快通关的路径,即移动的步数最少。并且输出结果到屏幕。其中,1<=n<=15, 3<=m<=15
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 位置 移动 字符 代表 路径 
2017-10-03 09:13
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
给一种思路,只求S到T的最短距离
程序代码:
#include <stdio.h>
#include <stdlib.h>

int count = 0;
int t = 999999;

void search(char str[][11], int x, int y)
{
    if (str[x][y] == 'T')
    {
        t = t < count ? t : count;
        return;
    }

    str[x][y] = '#';
    count++;
    if (str[x - 1][y] == '.' || str[x - 1][y] == 'T' )  search(str, x - 1, y);
    if (str[x + 1][y] == '.' || str[x + 1][y] == 'T')   search(str, x + 1, y);
    if (str[x][y - 1] == '.' || str[x][y - 1] == 'T')   search(str, x, y - 1);
    if (str[x][y + 1] == '.' || str[x][y + 1] == 'T')   search(str, x, y + 1);
    
    count--;
    str[x][y] = '.';
    
}
void main()
{
    int i = 0;
    char str[8][11] = {
        { "..####.#.#" },
        { "..#..#...#" },
        { "..#T##.#.#" },
        { ".........." },
        { "..##.#####" },
        { ".........." },
        { "#####...##" },
        { "###....S##" }
    };

    search(str, 7, 7);
    
    printf("%d", t);
    system("pause");
    return;
}

早知做人那么辛苦!  当初不应该下凡
2017-10-04 09:13
Marshul
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-10-2
收藏
得分:0 
谢谢
2017-10-04 10:07
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 2楼 炎天
广搜啊~这个题应该是用来卡一般广搜的~涉及到重复搜索问题~

其实转化一下就很简单了~第一次先广搜起点到所有秘笈的位置~

第二次广搜终点到所有秘笈的位置~

取两次加起来的最小值~

由于两次搜索除了起点位置不同其余的都一样的~所以广搜函数调用更改起点坐标就可以啦~这样代码利用率挺高的~

化简后实质还是广搜~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-10-04 10:39
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
回复 4楼 九转星河
P同一个秘籍,不一定到起点和终点的距离都是最短了

早知做人那么辛苦!  当初不应该下凡
2017-10-04 10:58
Marshul
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-10-2
收藏
得分:0 
回复 2楼 炎天
为何运行直接输出9
2017-10-04 10:58
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 炎天
秘籍到起点和终点加起来的距离和最短嘛~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-10-04 11:03
Marshul
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-10-2
收藏
得分:0 
为何不用输入了,直接输出9。。。
2017-10-04 11:05
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 2楼 炎天
把二楼的代码改进了一下~
感觉学多一点优化代码的能力就提升了一点~

程序代码:
#include <stdio.h>
#include <stdlib.h>

#define SEARCH(str,x,y)  str##[x][y]=='.'||str##[x][y]=='T'

int count = 0;
int t = 999999;

void search(char str[][11], int x, int y)
{
    if (str[x][y] == 'T')
    {
        t = t < count ? t : count;
        return;
    }

    str[x][y] = '#';
    count++;

    if (SEARCH(str,x-1,y))
        search(str, x-1, y);

    if (SEARCH(str,x+1,y))
        search(str, x+1, y);

    if (SEARCH(str,x,y-1))
        search(str,x,y-1);

    if (SEARCH(str,x,y+1))
        search(str,x,y+1);
    
    count--;
    str[x][y] = '.';
    
}
void main()
{
    int i = 0;
    char str[8][11] = {
        { "..####.#.#" },
        { "..#..#...#" },
        { "..#T##.#.#" },
        { ".........." },
        { "..##.#####" },
        { ".........." },
        { "#####...##" },
        { "###....S##" }
    };

    search(str, 7, 7);
    
    printf("%d\n", t);
    system("pause");
    return;
}


[此贴子已经被作者于2017-10-4 11:23编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-10-04 11:20
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
谢谢, 学习了!

早知做人那么辛苦!  当初不应该下凡
2017-10-04 12:22
快速回复:请帮我解一下这道题,不会
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.183530 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved