DFS枚举

DFS 枚举打表  小Z的矩阵

题意:一个矩阵 的每个数都大于或等于他的左边或者上边 问有多少种情况。输入n为矩阵的行m为矩阵的列。

思路:因为该矩阵最大为7*7所以直接打表枚举把每种行和列的情况都求出来,输入直接输出就行,用dfs:

对于位置x,y,我们判断这个位置放0,1,2的可能性

如果A[x-1,y] <= i && A[x,y-1]<=i (i=0,1,2)那么x,y位置就可以放i

之后赋值,继续搜索下一层(nex_x,new_y)的状态

当(x,y)不是每行最后一个数的时候,(nex_x,new_y) = (x,y+1)

否则 (nex_x,new_y) = (x+1,y);(一行一行的来赋值判断);

代码:

#include<stdio.h>

int a[10][10];
int aa[10][10];
int n,m;
int ans;
void dfs(int x,int y){
    if(x > n){
        ans ++;
        return;
    }
    if(a[x - 1][y] <= 0 && a[x][y - 1] <= 0){
        a[x][y] = 0;
        if(y < m) dfs(x , y + 1);
        else dfs(x + 1, 1);
    }
    if(a[x - 1][y] <= 1 && a[x][y - 1] <= 1){
        a[x][y] = 1;
        if(y < m) dfs(x , y + 1);
        else dfs(x + 1, 1);
    }
    if(a[x - 1][y] <= 2 && a[x][y - 1]<= 2){
        a[x][y] = 2;
        if(y < m) dfs(x , y + 1);
        else dfs(x + 1, 1);
    }
}
int main()
{
    for(int i = 1; i < 8; i++){
        for(int j = 1; j < 8; j++){
            ans = 0;
            n = i;
            m = j;
            dfs(1,1);
            aa[i][j]= ans;
        }
    }
    int t;
    scanf("%d",&t);
    for(int i = 0; i < t; i++){
        int x,y;
        scanf("%d%d",&x,&y);
        printf("%d\n",aa[x][y]);
    }

    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/qq_41650771/article/details/81314625