回 帖 发 新 帖 刷新版面

主题:关于国际象棋跳马问题(递归),前辈请进

#define BORDER 8
#define MAX 64
#include<iostream>
using namespace std;
int a[MAX]={0};
int b[MAX]={0};

int array[BORDER][BORDER]={0};


int main()
{
    int MoveHorse(int x,int y,int step);
    MoveHorse(0,0,0);
    return 0;
}
int MoveHorse(int x,int y,int step)
{
    array[x][y]=1;
    a[step]=x;
    b[step]=y;
    if(step>=63) //递归到63步直接打出来
    {
        for(int i=0;i<MAX-1;i++)
            cout<<a[i]<<","<<b[i]<<endl;
        /*for(int z=0;z<MAX;z++)
        {
            system("cls");
            int temp1=a[z];
            int temp2=b[z];
            array[temp1][temp2]=' ';
            for(int i;i<BORDER;i++)
            {    
                for(int j;j<BORDER;j++)
                    cout<<array[i][j];
                cout<<endl;
            }
        }*/
        system("PAUSE");
    }
    int i,j;
    //试探递归
    if(((i=x-2)>=0)&&((i=x-2)<BORDER)&&((j=y-1)>=0)&&((j=y-1)<BORDER)&&(!array[i][j]))
    {   if(MoveHorse(x-2,y-1,step+1)) return 1;}
    if(((i=x-2)>=0)&&((i=x-2)<BORDER)&&((j=y+1)>=0)&&((j=y+1)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x-2,y+1,step+1)) return 1;}
    if(((i=x-1)>=0)&&((i=x-1)<BORDER)&&((j=y+2)>=0)&&((j=y+2)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x-1,y+2,step+1)) return 1;}
    if(((i=x+1)>=0)&&((i=x+1)<BORDER)&&((j=y+2)>=0)&&((j=y+2)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x+1,y+2,step+1)) return 1;}
    if(((i=x+2)>=0)&&((i=x+2)<BORDER)&&((j=y+1)>=0)&&((j=y+1)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x+2,y+1,step+1)) return 1;}
    if(((i=x+2)>=0)&&((i=x+2)<BORDER)&&((j=y-1)>=0)&&((j=y-1)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x+2,y-1,step+1)) return 1;}
    if(((i=x+1)>=0)&&((i=x+1)<BORDER)&&((j=y-2)>=0)&&((j=y-2)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x+1,y-2,step+1)) return 1;}
    if(((i=x-1)>=0)&&((i=x-1)<BORDER)&&((j=y-2)>=0)&&((j=y-2)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x-1,y-2,step+1)) return 1;}
    array[x][y]=0;
    a[step]=0;
    b[step]=0;
    return 0;
}
为什么此程序出不来结果~一直在算住
当我把跳的步数改成if(step>=62)时,程序过了半分钟就出来结果了~但少跳一步~
我就不明白63步和62步只相差一步,执行时间差那么大~
是不是我的程序的逻辑上出错~望高手校正~

回复列表 (共3个回复)

沙发

计算过程没什么问题。
这个问题其实不一定要8x8的棋盘,5x5就可以有解了。我把楼主的程序做相应修改,很快就能计算出5x5的情况。7x7也可以在10秒以内算出来。

根据我的实验,8个方向的排列顺序,对运行速度有着明显影响。楼主给出的顺序,速度较慢,但如果稍微调整一下,则速度立即提升数十倍。8x8的情况也可以1秒内计算出来。
下面是调整之后的顺序:
    if(((i=x+1)>=0)&&((i=x+1)<BORDER)&&((j=y-2)>=0)&&((j=y-2)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x+1,y-2,step+1)) return 1;}
    if(((i=x+2)>=0)&&((i=x+2)<BORDER)&&((j=y-1)>=0)&&((j=y-1)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x+2,y-1,step+1)) return 1;}
    if(((i=x+2)>=0)&&((i=x+2)<BORDER)&&((j=y+1)>=0)&&((j=y+1)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x+2,y+1,step+1)) return 1;}
    if(((i=x+1)>=0)&&((i=x+1)<BORDER)&&((j=y+2)>=0)&&((j=y+2)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x+1,y+2,step+1)) return 1;}
    if(((i=x-1)>=0)&&((i=x-1)<BORDER)&&((j=y+2)>=0)&&((j=y+2)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x-1,y+2,step+1)) return 1;}
    if(((i=x-2)>=0)&&((i=x-2)<BORDER)&&((j=y+1)>=0)&&((j=y+1)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x-2,y+1,step+1)) return 1;}
    if(((i=x-2)>=0)&&((i=x-2)<BORDER)&&((j=y-1)>=0)&&((j=y-1)<BORDER)&&(!array[i][j]))
    {   if(MoveHorse(x-2,y-1,step+1)) return 1;}
    if(((i=x-1)>=0)&&((i=x-1)<BORDER)&&((j=y-2)>=0)&&((j=y-2)<BORDER)&&(!array[i][j]))
    {    if(MoveHorse(x-1,y-2,step+1)) return 1;}

感觉很神奇,调换顺序之后,速度就及时上百倍的提升了,我也无法分析出其中的原因。

板凳


非常谢谢~

3 楼


对于跳马方向影响效率,谁能给出解释~大家探讨下~小弟希望能学到一点经验~

我来回复

您尚未登录,请登录后再回复。点此登录或注册