| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2551 人关注过本帖
标题:一个小迷宫问题,求指教
只看楼主 加入收藏
青蝶
Rank: 2
等 级:论坛游民
帖 子:160
专家分:51
注 册:2018-2-4
结帖率:92%
收藏
已结贴  问题点数:20 回复次数:11 
一个小迷宫问题,求指教
题目大意:
输入一个n行m列的字符型矩阵,其中S代表起点 T代表终点,"*"代表墙,"."代表路,问能否从S走到T,并且转弯不超过两次(初始方向可以是任意的)?
..S..
****.
T.....
****.
......
比如上图可以走到,需要转弯两次。

想问一下判断转弯超不超过两次应该怎么实现?
搜索更多相关主题的帖子: 迷宫 代表 初始 任意 判断 
2018-05-24 10:41
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:4 
应该和你前贴https://bbs.bccn.net/thread-487220-1-1.html方法差不多,用一个数组记录步进方向就可以的。

能编个毛线衣吗?
2018-05-24 11:12
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:4 
我想到了连连看
~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-24 11:15
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:4 
回复 3楼 九转星河
就是连连看的算法嘛

https://zh.
2018-05-24 11:19
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:4 
回复 楼主 青蝶
可以通过下面的方法实现:
首先确定开始步行时是什么方向,这里说的方向指的是行变列不变,或者列变行不变。如果中途由行变列不变变成了列变行不变,就说明改变了方向。反之依然。这段话是用文字叙述的。下面改为数组语言叙述一篇:
比如开始步行是0行5列,即0 5接下来是0 6,0 7,0 8,0 9,到这里一直是列变行不变,下一步出现1 9,这里就出现了行变列不变,这就说明在这里改变了方向。就是这个意思。
2018-05-25 00:02
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
广度优先搜索
记录当前方向和移动方向
不一样就改变方向 +1
改变方向第3次的直接return

https://zh.
2018-05-25 00:29
青蝶
Rank: 2
等 级:论坛游民
帖 子:160
专家分:51
注 册:2018-2-4
收藏
得分:0 
仿照之前的帖子写了一个程序,但是运行被终止,可以帮忙看一下怎么回事么?

#include<stdio.h>
#include<stdlib.h>
char a[1000][1000];
int f(char a[][1000],int i,int j,int n,int m,int dir,int k){
    int n1=0,n2=0,n3=0,n4=0;
    if(k<=3 && a[i][j]=='T') return 1;  /*最开始不知道方向,k设为零(不等于1,2,3,4),默认为开始的时候转了一次弯,所以最后k<=3就行 */
    if(k>3) return 0;                           
    else{
        a[i][j]='*';       /*要研究的点一定是通路,把它置成断路的,防止倒车,影响下面运算 */
        if(i+1<n && a[i+1][j]!='*'){
            if(dir==1) n1=f(a,i+1,j,n,m,1,k);   /* 向上走,方向标记为1 */
            else n1=f(a,i+1,j,n,m,1,k+1);       /*如果这次选择走的方向和上一次不一样,转弯次数k加1 */
        }
        if(i-1<=0 && a[i-1][j]!='*'){
            if(dir==2) n2=f(a,i-1,j,n,m,2,k);   /*向下走,方向标记为2 */
            else n2=f(a,i-1,j,n,m,2,k+1);
        }
        if(j+1<m && a[i][j+1]!='*'){         
            if(dir==3) n3=f(a,i,j+1,n,m,3,k);   /*向右走,方向标记为3 */
            else n3=f(a,i,j+1,n,m,3,k+1);
        }
        if(j-1>=0 && a[i][j-1]!='*'){
            if(dir==4) n4=f(a,i,j-1,n,m,4,k);   /*向左走,方向标记为4 */
            else n4=f(a,i,j-1,n,m,4,k+1);
        }
        printf("n1=%d,n2=%d,n3=%d,n4=%d\n",n1,n2,n3,n4);
        
        if((n1||n2||n3||n4)==0){                /*如果有一种路线能走到终点,函数就返回1 */
            a[i][j]='.';
            return 0;
        }
        else{
          return 1;
    }
}
}
   
        
int main(void){
  int n,m,i,j,i0,j0,i1,j1,dir,k;
  while((scanf("%d %d",&n,&m))!=EOF){
      for(i=0;i<n;i++) scanf("%s",a[i]);
      for(i=0;i<n;i++){
          for(j=0;j<n;j++){
              printf("%c ",a[i][j]);
              if(j==n-1) printf("\n");
              if(a[i][j]=='S'){
                  i0=i;
                  j0=j;
              }
          }
      }
      printf("%d %d\n",i0,j0);
      dir=0;
      k=0;
      if(f(a,i0,j0,n,m,dir,k)) printf("YES\n");
      else printf("NO\n");
  }
  return 0;
}

2018-05-25 00:32
青蝶
Rank: 2
等 级:论坛游民
帖 子:160
专家分:51
注 册:2018-2-4
收藏
得分:0 
回复 6楼 lin5161678
我用的深度优先搜索,可能复杂度太高了?
2018-05-25 00:37
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
以下是引用lin5161678在2018-5-25 00:29:11的发言:

广度优先搜索
记录当前方向和移动方向
不一样就改变方向 +1
改变方向第3次的直接return

用移动方向判断具体还是要同时记录该位置的四个方向有几个位置能够在同一次拐弯走通,简单广搜这样弄会有数据重复的部分~

可以先深搜第一步能找到的~再把搜到的结点加入广搜队列~

对于3步而言~

可以先从终点找出第一步能走到的位置,然后再从起点搜转一个弯能达到的位置,看和终点的有没有交集的地方~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-25 06:59
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:4 
原来连连看是这样玩啊?那看上去用控制台实现一个类似的游戏不难嘛,比如成语接龙、古诗词接下句等(毕竟控制台无法实现那么多花色,显示汉字是容易的),windows控制台下操作鼠标不是问题,@九转星河版主,要不写一个呗,也让我们认真学习下大作嘛!
2018-05-26 12:06
快速回复:一个小迷宫问题,求指教
数据加载中...
 
   



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

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