3 条题解

  • 0
    @ 2022-7-26 21:13:49
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <algorithm>
    using namespace std;
    const int N=25;
    int a[N][N]; /*构建矩阵*/
    int n;
    int sum=0;
    void dfs(int x,int y){
        if(x==1&&y==n) sum++;                   /*返回条件,注意是到右上的点*/
        else {
            if(x+1<=n&&y+1<=n&&a[x*2][y*2]<=0&&
               !a[(x+1)*2-1][(y+1)*2-1]){       /*可以通过的条件,用数组存储运动更好*/
                a[(x+1)*2-1][(y+1)*2-1]=1;      /*点的标记*/
                a[x*2][y*2]=1;                  /*点与点之间状态,*/
                dfs(x+1,y+1);                   /*注意:对角线经过的点状态是不同的,*/
                a[(x+1)*2-1][(y+1)*2-1]=0;      /*下面是用-1代表右上角与左下角的运动,*/        
                a[x*2][y*2]=0;                  /*1代表左上角与右下角的运动*/
            }
            if(y+1<=n&&a[x*2-1][2*y]==0&&
               !a[x*2-1][(y+1)*2-1]){
                a[x*2-1][(y+1)*2-1]=1;
                a[x*2-1][2*y]=1;
                dfs(x,y+1);
                a[x*2-1][(y+1)*2-1]=0;
                a[x*2-1][2*y]=0;
            }
            if(x-1>=1&&y+1<=n&&a[(x-1)*2][y*2]>=0&&
               !a[(x-1)*2-1][(y+1)*2-1]){
                a[(x-1)*2-1][(y+1)*2-1]=1;
                a[(x-1)*2][y*2]=-1;             /*左下到右上*/
                dfs(x-1,y+1);
                a[(x-1)*2-1][(y+1)*2-1]=0;
                a[(x-1)*2][y*2]=0;
            }
            if(x+1<=n&&a[x*2][2*y-1]==0&&
               !a[(x+1)*2-1][y*2-1]){
                a[(x+1)*2-1][y*2-1]=1;
                a[x*2][2*y-1]=1;
                dfs(x+1,y);
                a[(x+1)*2-1][y*2-1]=0;
                a[x*2][2*y-1]=0;
            }
            if(x-1>=1&&a[(x-1)*2][2*y-1]==0&&
               !a[(x-1)*2-1][y*2-1]){
                a[(x-1)*2-1][y*2-1]=1;
                a[(x-1)*2][2*y-1]=1;
                dfs(x-1,y);
                a[(x-1)*2][2*y-1]=0;
                a[(x-1)*2-1][y*2-1]=0;
            }
    
            if(y-1>=1&&a[2*x-1][2*y-2]==0&&
               !a[x*2-1][(y-1)*2-1]){
                a[x*2-1][(y-1)*2-1]=1;
                a[2*x-1][2*y-2]=1;
                dfs(x,y-1);
               a[x*2-1][(y-1)*2-1]=0;
                a[2*x-1][2*y-2]=0;
            }
            if(x+1<=n&&y-1>=1&&a[x*2][(y-1)*2]>=0&&
               !a[(x+1)*2-1][(y-1)*2-1]){
                a[(x+1)*2-1][(y-1)*2-1]=1;
                a[x*2][(y-1)*2]=-1;             /*右上到左下*/
                dfs(x+1,y-1);
                a[(x+1)*2-1][(y-1)*2-1]=0;
                a[x*2][(y-1)*2]=0;
            }
    
            if(x-1>=1&&y-1>=1&&a[(x-1)*2][(y-1)*2]<=0&&
               !a[(x-1)*2-1][(y-1)*2-1]){
                a[(x-1)*2-1][(y-1)*2-1]=1;
                a[(x-1)*2][(y-1)*2]=1;
                dfs(x-1,y-1);
                a[(x-1)*2-1][(y-1)*2-1]=0;
                a[(x-1)*2][(y-1)*2]=0;
            }
        }
    }
    int main()
    {
        sum=0;
        scanf("%d",&n);
        memset(a,0,sizeof(a));                 /*矩阵清零*/
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&a[2*i-1][2*j-1]);
        a[1][1]=1;
        dfs(1,1);                              /*调用递归*/
        printf("%d\n",sum);
        return 0;
    }
    

    信息

    ID
    1296
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    299
    已通过
    91
    上传者