回 帖 发 新 帖 刷新版面

主题:新人求助,关于用C++解决西洋棋中骑士的走法

西洋棋中骑士的走法与象棋的马类似,只能横向二格,纵向一格或者横向一格,纵向两格(但是西洋棋棋子必须放在格子中),第1步有2种走法,第二步就有5种走法.今有5*5的棋盘,并将骑士的第一步放于左上角(0,0)的位置,试找出一个路径,使骑士在25步内把剩下的24个位置全部走完.输出结果时,将骑士的路径显示于的5*5的方格中,每一方格内显示出走到此方格内为第同步的数字.


我是一个初学C++的人,看到这个问题后想了很久写下了下面的这段代码但是运行不了。麻烦各位大大给我看看我哪里错了。在下不胜感激。谢谢大家了!

#include <iostream.h>
void main()
{
    int a[5][5];
    int sx[25],sy[25];
    int i,j,n=0;
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            a[i][j]=0;
    cout<<"这是一个游戏\n";
    i=0;j=0;
    while(n<25)
    {
        a[i][j]=1;
        sx[n]=i;
        sy[n]=j;
        n++;
        if(n==25) break;
        if(i+2<5&&j+1<5&&a[i+2][j+1]==0)
        {
            i+=2;j+=1;continue;
        }
two:    if(i+2<5&&j-1>=0&&a[i+2][j-1]==0)
        {
            i+=2;j-=1;continue;
        }
three:    if(i-2>=0&&j+1<5&&a[i-2][j+1]==0)
        {
            i-=2;j+=1;continue;
        }
four:    if (i-2>=0&&j-1>=0&&a[i-2][j-1]==0)
        {
            i-=2;j-=1;continue;
        }
five:    if(i+1<5&&j+2<5&&a[i+1][j+2]==0)
        {
            i+=1;j+=2;continue;
        }
six:    if(i+1<5&&j-2>=0&&a[i+1][j-2]==0)
        {
            i+=1;j-=2;continue;
        }
seven:    if(i-1>=0&&j+2<5&&a[i-1][j+2]==0)
        {
            i-=1;j+=2;continue;
        }
eigth:    if(i-1>=0&&j-2>=0&&a[i-1][j-2]==0)
        {
            i-=1;j-=2;continue;
        }
again:    n--;
        i=sx[n-1];
        j=sy[n-1];
        if((sx[n]-sx[n-1])==2&&(sy[n]-sy[n-1])==1)
            goto two;
        else if((sx[n]-sx[n-1])==2&&(sy[n]-sy[n-1])==-1)
            goto three;
        else if((sx[n]-sx[n-1])==-2&&(sy[n]-sy[n-1])==1)
            goto four;
        else if((sx[n]-sx[n-1])==-2&&(sy[n]-sy[n-1])==-1)
            goto five;
        else if((sx[n]-sx[n-1])==1&&(sy[n]-sy[n-1])==2)
            goto six;
        else if((sx[n]-sx[n-1])==1&&(sy[n]-sy[n-1])==-2)
            goto seven;
        else if((sx[n]-sx[n-1])==-1&&(sy[n]-sy[n-1])==2)
            goto eigth;
        else if((sx[n]-sx[n-1])==-1&&(sy[n]-sy[n-1])==-2)
            goto again;
    }
    cout<<"25步的走法分别是\n";
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            cout<<a[i][j];
    for(n=0;n<25;n++)
        cout<<"第"<<n+1<<"步是:("<<sx[n]<<","<<sy[n]<<")."<<endl;
}

回复列表 (共1个回复)

沙发

修改了一个但是还是不能实现我想要的东西?谁能帮帮我啊!谢谢了。
#include <iostream.h>
int a[5][5];
int *sx=new int[25];
int *sy=new int[25];
int i,j,n=0;
int route(int b)
{    
    int result=0;
    int d[8]={0,0,0,0,0,0,0,0};
    switch(b)
    {
        case 1: d[0]=0;d[1]=1;break;
        case 2: d[0]=0;d[2]=1;break;
        case 3: d[0]=0;d[3]=1;break;
        case 4: d[0]=0;d[4]=1;break;
        case 5: d[0]=0;d[5]=1;break;
        case 6: d[0]=0;d[6]=1;break;
        case 7: d[0]=0;d[7]=1;break;
        case 8: d[0]=1;break;
    }
    if(d[0]==1)
    {
        if(i+2<5&&j+1<5&&a[i+2][j+1]==0)
        {
            i+=2;j+=1;result=1;
        }
        else
            d[1]=1;
    }
    if(d[1]==1)
    {    
        if(i+2<5&&j-1>=0&&a[i+2][j-1]==0)
        {
            i+=2;j-=1;result=1;
        }
        else
            d[2]=1;
    }
    if(d[2]==1)
    {
        if(i-2>=0&&j+1<5&&a[i-2][j+1]==0)
        {
            i-=2;j+=1;result=1;
        }
        else
            d[3]=1;
    }
    if(d[3]==1)
    {
        if (i-2>=0&&j-1>=0&&a[i-2][j-1]==0)
        {
            i-=2;j-=1;result=1;
        }
        else
            d[4]=1;
    }
    if(d[4]==1)
    {
        if(i+1<5&&j+2<5&&a[i+1][j+2]==0)
        {
            i+=1;j+=2;result=1;
        }
        else
            d[5]=1;
    }
    if(d[5]==1)
    {
        if(i+1<5&&j-2>=0&&a[i+1][j-2]==0)
        {
            i+=1;j-=2;result=1;
        }
        else
            d[6]=1;
    }
    if(d[6]==1)
    {
        if(i-1>=0&&j+2<5&&a[i-1][j+2]==0)
        {
            i-=1;j+=2;result=1;
        }
        else
            d[7]=1;
    }
    if(d[7]==1)
    {
        if(i-1>=0&&j-2>=0&&a[i-1][j-2]==0)
        {
            i-=1;j-=2;result=1;
        }
    }
    return result;
}
void again()
{        n--;
        i=sx[n-1];
        j=sy[n-1];
        a[i][j]=0;
        if((sx[n]-sx[n-1])==2&&(sy[n]-sy[n-1])==1)
            route(1);
        else if((sx[n]-sx[n-1])==2&&(sy[n]-sy[n-1])==-1)
            route(2);
        else if((sx[n]-sx[n-1])==-2&&(sy[n]-sy[n-1])==1)
            route(3);
        else if((sx[n]-sx[n-1])==-2&&(sy[n]-sy[n-1])==-1)
            route(4);
        else if((sx[n]-sx[n-1])==1&&(sy[n]-sy[n-1])==2)
            route(5);
        else if((sx[n]-sx[n-1])==1&&(sy[n]-sy[n-1])==-2)
            route(6);
        else if((sx[n]-sx[n-1])==-1&&(sy[n]-sy[n-1])==2)
            route(7);
        else if((sx[n]-sx[n-1])==-1&&(sy[n]-sy[n-1])==-2)
            again();
}
void main()
{
    
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            a[i][j]=0;
    cout<<"这是一个游戏\n";
    i=0;j=0;
    while(n<25)
    {
        a[i][j]=1;
        sx[n]=i;
        sy[n]=j;
        n++;
        if(n==25) break;
        if(route(8)==1) continue;
        again();
    }
    cout<<"25步的走法分别是\n";
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            cout<<a[i][j];
    for(n=0;n<25;n++)
        cout<<"第"<<n+1<<"步是:("<<sx[n]<<","<<sy[n]<<")."<<endl;
    delete sx,sy;
}

我来回复

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