我觉得我的思路没问题,但是3、4错。求指教
查看原帖
我觉得我的思路没问题,但是3、4错。求指教
1346964
XianZai楼主2024/5/16 16:51
#include<iostream>
using namespace std;
int main()
{
    int maX,maY;//马的位置
    int X,Y;//棋盘大小
    cin>>X>>Y>>maX>>maY;

    int ban[9][2];//禁止通过的点,最多有9个
    //下面的代码块获取马的位置和可达位置
    {
        ban[0][0]=maX;
        ban[0][1]=maY;

        ban[1][0]=maX-1;
        ban[1][1]=maY-2;

        ban[2][0]=maX+1;
        ban[2][1]=maY-2;

        ban[3][0]=maX-2;
        ban[3][1]=maY-1;

        ban[4][0]=maX+2;
        ban[4][1]=maY-1;

        ban[5][0]=maX-2;
        ban[5][1]=maY+1;

        ban[6][0]=maX+2;
        ban[6][1]=maY+1;

        ban[7][0]=maX-1;
        ban[7][1]=maY+2;

        ban[8][0]=maX+1;
        ban[8][1]=maY+2;
    }

    unsigned int count[X+1][Y+1];//记录每个点到终点的途径数目
    //当点(x,y)在禁行区,其值设为0
    //点(x,y)不在禁行区,其值等于(x+1,y)与(x,y+1)的和
    //即得到递推公式 count[x][y] = count[x+1][y] + count[x+1][y]
    count[X][Y]=1;//设置起始条件,终点到终点的途径数目为 1
    for(int x=X;x>=0;x--)
    {
        for(int y=Y;y>=0;y--)
        {
            if(x==X&&y==Y)continue;//点(X,Y)已在循环体外赋值
            else
            {
                bool BanFlag=false;//BanFlay表示点(x,y)是禁止通过的点
                for(int i=0;i<9;i++)
                {
                    if(ban[i][0]==x && ban[i][1]==y)//点(x,y)在禁行区内
                    {
                        BanFlag=true;
                        count[x][y]=0;
                        break;
                    }
                }
                if(BanFlag) continue;//禁行点已处理
                else if(x==X)count[x][y]=count[x][y+1];//在棋盘右侧,只加下侧元素
                else if(y==Y)count[x][y]=count[x+1][y];//在棋盘底部,只加右侧元素
                else count[x][y]=count[x+1][y]+count[x][y+1];//在棋盘底部,同时加 下、右侧元素
            }
        }
    }
    cout<<count[0][0];
    return 0;
    //
}



2024/5/16 16:51
加载中...