终于过了这个第二题,虽然烂但是个人感觉得注意三个点
查看原帖
终于过了这个第二题,虽然烂但是个人感觉得注意三个点
1534255
I_Automne楼主2024/10/26 13:15

写的C,而且很繁琐(泣) 基础不牢是这样的,不过AC了还是很开心 这道题有三个点要注意吧, 一是给0行和0列赋值1的时候需要判断0行0列上有没有马的控制点,控制点后面的值不能赋值1了只能是0; 二是需要判断控制点是否越界,C一越界就各种奇怪问题(真的会很奇怪的) 三是要开longlong 附代码,应该没人写的比我烂了

    #include <stdio.h>

    //马拦过河卒问题
    void bo(long long arr[21][21],int hx,int hy,int x,int y,int z){
            if ((0<=hx+x)&&(hx+x<=20)&&(0<=hy+y)&&(hy+y<=20))
            {
                arr[hx+x][hy+y] = z;
            }
    }
    //一个小函数 判断是否越界加赋值

    int main(){
        long long arr[21][21] = {0};      //二维数组棋盘20*20,全定义为0
        int n,m;        //B点坐标
        int hx,hy;      //马坐标
        scanf("%d%d%d%d",&n,&m,&hx,&hy);        //输入B坐标与马坐标

        bo(arr,hx,hy,1,2,2);
        bo(arr,hx,hy,2,1,2);
        bo(arr,hx,hy,-1,2,2);
        bo(arr,hx,hy,-2,1,2);
        bo(arr,hx,hy,1,-2,2);
        bo(arr,hx,hy,2,-1,2);
        bo(arr,hx,hy,-1,-2,2);
        bo(arr,hx,hy,-2,-1,2);
        bo(arr,hx,hy,0,0,2);

        for (int ix = 0,iy = 0; arr[ix][iy] == 0; ix++)     //赋予两端的路径为1种可能(撞到2就不赋值后面的了)
        {
            arr[ix][iy] = 1;
        }
            arr[0][0] = 0;
        for (int ix = 0,iy = 0; arr[ix][iy] == 0; iy++)
        {
            arr[ix][iy] = 1;
        }
            arr[0][0] = 0;

        bo(arr,hx,hy,1,2,0);
        bo(arr,hx,hy,2,1,0);
        bo(arr,hx,hy,-1,2,0);
        bo(arr,hx,hy,-2,1,0);
        bo(arr,hx,hy,1,-2,0);
        bo(arr,hx,hy,2,-1,0);
        bo(arr,hx,hy,-1,-2,0);
        bo(arr,hx,hy,-2,-1,0);
        bo(arr,hx,hy,0,0,0); 


        for (int ix = 0; ix <= n ; ix++)       //遍历x
        {
            for (int iy = 0; iy <= m; iy++)     //遍历y
        {
            if ((ix!=hx+1||iy!=hy+2)&&
                (ix!=hx+2||iy!=hy+1)&& 
                (ix!=hx+1||iy!=hy-2)&&
                (ix!=hx+2||iy!=hy-1)&&
                (ix!=hx-1||iy!=hy+2)&&
                (ix!=hx-2||iy!=hy+1)&&
                (ix!=hx-1||iy!=hy-2)&&
                (ix!=hx-2||iy!=hy-1)&&
                (ix!=hx||iy!=hy)&&
                (ix!=0)&&(iy!=0))
                {
                    arr[ix][iy] = arr[ix-1][iy] + arr[ix][iy-1];        //递推算法
                }
            
        }
        }

        // //DEBUG打印
        // for (int iy = 0; iy <= m ; iy++)       //遍历x
        // {
        //     for (int ix = 0; ix <= n; ix++)     //遍历y
        //     {
        //     printf("%lld   ",arr[ix][iy]);
        //     }
        //     printf("\n");
        // }

    printf("%lld\n",arr[n][m]);     //输出可能的路径数(路径算法)

    return 0;
    }
2024/10/26 13:15
加载中...