'*'和'.'组成的符号矩阵假设是一条河,用C语言求过河路线,为什么我的代码总是在求下一步的递归那里break?-问答-阿里云开发者社区-阿里云

开发者社区> a123456678> 正文

'*'和'.'组成的符号矩阵假设是一条河,用C语言求过河路线,为什么我的代码总是在求下一步的递归那里break?

2016-06-12 10:26:35 2695 1

这是题目,我大概概括一下
用'※'和'.'组成如图所示的矩阵字符串,'※'是石头,'.'是河水,过河只能踩着石头过,而且必须是你所在的石头的下一竖列的正前方或者最近的两个斜对角的石头,用example里那种纵向数字表示石头的标号,求出一个过河的路线,打印出路线经过的石头的标号
(还有一点不太懂,题里写着可以用#define定义矩阵?如何定义?)
(后面附上我的代码,递归没写好)
screenshot

int i=0,j=0,flag=0;
char s[80];
int k=0,l=0;
char river[80][80];

//求下一步落脚石的函数
void NextStep(k,l){
    s[l]=k;    //储存每一步落脚石纵向坐标的数组
    
    //当K大于等于第二行的时候
    if (k>0) {
        
        //检测下一竖列与之对应的最近上中下位置是否有石头
        if (river[l+1][k-1]=='*') {
            l+=1;
            k-=1;
        }
        if (river[l+1][k]=='*') {
            l+=1;
        }
        if (river[l+1][k+1]=='*') {
            k+=1;
            l+=1;
        }
        
        //没有合适的落脚石的时候
        else {
            //如果此刻停留在第一竖列,继续向下找另一个'*'
            if (l==0) {
                for (int h=s[0]; h<5; h++) {
                    if (strchr(&river[h][l], '*')){
                        k=h;
                        s[l]=k;
                        flag=1;
                        break;
                    }
                }
                
            }
            //如果不在第一竖列,去第一竖列找下一个'*',并把l归零
            if (l>0) {
                for (int h=s[0]; h<5; h++) {
                    if (strchr(&river[h][l], '*')){
                        k=h;
                        l=0;
                        s[l]=k;
                        flag=1;
                        break;
                    }
                        
                }
            }
            //找不到的时候,退出程序
            if (flag==0) {
                printf("没有合适的石头\n",l);
                exit(0);
            }

        }
        
    }
    
    //当K大于在第一行的时候(防止越界求K-1,单独列出来),思路同上
    if (k==0) {
        if (river[k+1][l+1]=='*') {
            k+=1;
            l+=1;
        }
        if (river[k][l+1]=='*') {
            l+=1;
        }
        else {
            if (l==0) {
                for (int h=s[0]; h<5; h++) {
                    if (strchr(&river[h][l], '*')){
                        k=h;
                        s[l]=k;
                        flag=1;
                        break;
                    }
                }
                
            }
            if (l>0) {
                for (int h=s[0]; h<5; h++) {
                    if (strchr(&river[h][l], '*')){
                        k=h;
                        l=0;
                        s[l]=k;
                        flag=1;
                        break;
                    }
                    
                }
            }
            if (flag==0) {
                printf("没有合适的石头\n",l);
                exit(0);
            }
            
        }
    }
    unsigned long n=strlen(river[0]);
    //当落脚石没求到最后一竖列的时候,递归
    if (l<n-1)
        NextStep(k,l);    //编译的breakpoint
}

int main(){
    //输入五行字符
    for (j=0; j<5; j++) {
        printf("请输入第%d行",j+1);
        gets(river[j]);
    }
    //找到第一竖列第一个'*'
    for (j=0; j<5; j++) {
        if(strchr(&river[j][0], '*'))
            break;
    }
    k=j;
    l=0;
    NextStep(k,l);
    
    //打印函数求得的数组
    for (l=0; l<strlen(river[0]); l++) {
        printf("%d",s[l]);
    }
}

breakpoint在函数NextStep()的递归那里,不太懂为啥……
这段代码Bug还蛮多的…………
总之求前辈教育TUT

取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:33:20
    #/usr/bin/env perl
    use strict;
    use warnings;
    my $River = <<ENDL;
    *.*..
    *..*.
    .*..*
    *..*.
    .**.*
    *..*.
    ..*..
    ...*.
    .*..*
    .*.*.
    *...*
    ENDL
    
    my @Rivers = split /\n/, $River;
    for (@Rivers) {
        $_ = [ split //, $_ ];
    }
    #Generate River Matrix
    
    # GOGOGO
    my @Path;
    sub GetNext {
        my $Row    = shift;
        my $Column = shift;
        if ($Rivers[$Row]->[$Column] eq '*') {
            if ($Row + 1 > $#Rivers) {
    
                # Successful;
                print join "->", @Path;
                exit;
            }
            if ($Column - 1 >= 0) {
                push @Path, $Column - 1;
                GetNext($Row + 1, $Column - 1);
    
            }
            push @Path, $Column;
            GetNext($Row + 1, $Column);
            if ($Column + 1 <= 5) {
                push @Path, $Column + 1;
                GetNext($Row + 1, $Column + 1);
            }
        }
        pop @Path;
    }
    
    @Path = ();
    push @Path, 0;
    GetNext(0, 0);
    @Path = ();
    push @Path, 2;
    GetNext(0, 2);
    结果:
    2->3->4->3->2->3->2->3->4->3->4->3
    0 0
相关问答

17

回答

教你如何简单将OSS bucket挂载成为阿里云ECS服务器本地盘

梦丫头 2017-02-17 14:01:12 37897浏览量 回答数 17

5

回答

【阿里云】linux服务器安装nginx配置多个站点两种方法

自娱自乐 2014-03-29 14:53:12 22376浏览量 回答数 5

9

回答

阿里云ECS安装虚拟主机系统DirectAdmin开心版百分百成功的方法

hxs 2014-05-26 20:05:30 34390浏览量 回答数 9

10

回答

AMH5.0安装脚本顺便提醒是收费的每月5元。

是非良人 2014-08-31 15:13:27 20821浏览量 回答数 10

8

回答

阿里云服务器内网传输使用指南

任逍遥 2013-03-22 00:05:42 30496浏览量 回答数 8

3

回答

2020年05月编程排行榜-C语言继2015年,重新成为编程排行榜第一名

huc_逆天 2020-05-06 13:43:42 35326浏览量 回答数 3

4

回答

上传到OSS的文件md5hash值如何获取?!!

asker 2015-08-05 16:52:10 20901浏览量 回答数 4

14

回答

C语言基础 【精品问答合集】

我是管理员 2018-07-13 15:37:00 26588浏览量 回答数 14

10

回答

阿里云centos静默安装oracle

美味的小鱼 2014-08-12 14:23:44 30494浏览量 回答数 10

5

回答

C语言算法 【精品问答合集】

我是管理员 2018-07-13 15:51:28 26907浏览量 回答数 5
+关注
0
文章
14879
问答
相关电子书
更多
《SaaS模式云原生数据仓库应用场景实践》
立即下载
文娱运维技术
立即下载
《看见新力量:二》电子书
立即下载