| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 675 人关注过本帖, 1 人收藏
标题:关于马的走法,很让我抑郁,高手们帮帮我
取消只看楼主 加入收藏
温顾
Rank: 2
等 级:论坛游民
帖 子:28
专家分:21
注 册:2011-8-6
结帖率:75%
收藏(1)
已结贴  问题点数:20 回复次数:3 
关于马的走法,很让我抑郁,高手们帮帮我
在一个4*5的棋盘上,输入马的起始位置坐标(纵、横),求马能返回初始位置的所有不同走法的总数(马走过的位置不能重复,马走“日”字)。这是我在论坛上看到的一个程序,我对每个语句都理解,也清楚是什么意思,可就是逻辑上有些糊涂,他到底怎么实现功能的,而且我也觉得这个程序好像有些错误,这是我自己的一些注释;希望大家可以帮下我弄清楚这个流程是怎么回事也就是从算法的角度帮我讲解下 谢谢
程序代码:
#include<stdio.h>
#include<string.h>                                                            //头文件
int dir[8][2]={{2,1},{1,2},{-1,2},{-2,1},{1,-2},{2,-1},{-1,-2},{-2,-1}};      //定义一个二维数组,代表马走的几种情况,因为马是进二平一的走日字型,这里面囊括了马走前后左右的全部情况
int count;                                                                    //定义一个count,用来计马能返回初始位置的所有不同走法的总数
int n,m;                                                                      //n,m为马的起始位置的坐标
int map[6][7];                                                                //定义map数组用来规定马走过的位置不能重复,具体用到时再说
void bfs(int x,int y)                                                         //定义一个函数,在其中实现主要功能
{
    int xx,yy;                                                                //xx,yy是用来记录马每走一步后的坐标
    int i;                                                                    //定义整型i,for语句要用到
    for(i=0;i<8;i++)                                                          //for语句循环
    {
        xx=x+dir[i][0];                                                      
        yy=y+dir[i][1];                                                       //这两句其实就是让马行进一步后的结果,xx,yy就是行进后马的坐标
        if(xx>5||xx<=0||yy>4||yy<=0)                                         
        continue;                                                             //这两句是判断语句,如果满足if语句中的任何一个条件,表示坐标越界,结束本次循环,返回for语句进行下一次循环。否则顺序执行
        if(map[xx][yy])                                                      
        continue;                                                             //如果map[xx][yy]为1,代表马已经走过此步,不能再走此步,结束本次循环,返回for语句进行下一次循环。否则顺序执行
        if(xx==n&&yy==m)                                                   
        {
            count++;
            continue;
        }                                                                     //如果xx=n并且yy=m表示马已经返回原始位置,完成一次返回原始位置的走法,count加1,结束本次循环,返回for语句进行下一次循环。否则顺序执行
        map[xx][yy]=1;                                                        //给map[xx][yy]赋一,代表已近走过此步
        bfs(xx,yy);                                                           //再次调用此函数,将xx,yy作为初始值x,y继续执行,直到返回原位置
        map[xx][yy]=0;
    }
}
int main()                                                                    //主函数,程序开始的位置
{
    while(scanf("%d%d",&n,&m)!=EOF)                                           //循环语句,输入起始坐标,EOF为结束标志
    {
        count=0;                                                              //count赋初值
        memset(map,0,sizeof(map));                                            //清零map数组的所有项
        bfs(n,m);                                                             //调用bfs函数进行求马能返回初始位置的所有不同走法的总数
        printf("%d\n",count);                                                 //输出count值
    }
    return 0;                                                                 //如果程序无语法错误,主函数的返回值为0
} 

搜索更多相关主题的帖子: 抑郁 而且 
2011-08-15 12:46
温顾
Rank: 2
等 级:论坛游民
帖 子:28
专家分:21
注 册:2011-8-6
收藏
得分:0 
回复 2楼 jcw08120110
你讲的很好 但是我是初学者 还有很多地方不是很明白 比如说递归法那个 循环执行bfs,当执行到bfs(xx,yy)时 又调用bfs函数 那bfs(xx,yy)后的map[xx][yy]=0;怎么执行呢
2011-08-15 21:04
温顾
Rank: 2
等 级:论坛游民
帖 子:28
专家分:21
注 册:2011-8-6
收藏
得分:0 
回复 5楼 jcw08120110
看起来很神奇的样子 我再看看吧 可能我还没学到位吧 有些东西很难理解 不过还是谢谢你
2011-08-16 10:15
温顾
Rank: 2
等 级:论坛游民
帖 子:28
专家分:21
注 册:2011-8-6
收藏
得分:0 
回复 7楼 jcw08120110
谢谢你 我弄懂了些
2011-08-17 11:27
快速回复:关于马的走法,很让我抑郁,高手们帮帮我
数据加载中...
 
   



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

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