在C中的2d手机键盘上打印每个解锁图案

我想编写一个打印所有可能的模式的函数,如以下示例所示。在每种情况下,我们都必须从3x3阵列的左上方开始。与解锁手机的模式类似,不同之处在于,该线不能斜着穿过,必须穿过每个盒子。

1--->2--->3           1--->2--->3
          |                     |
          v                     v
8<---7    4     or    6<---5<---4
|    ^    |           |
v    |    v           v
9    6<---5           7--->8--->9

我首先编写了一个代码,其中[0][0]被分配为1,然后将2d数组中的其余数字随机化,直到1[0]或0等于2,依此类推。但是我觉得这使问题变得更加难以解决。

然后尝试使用递归一次又一次地调用makePattern函数,直到更改数组为止。但是,由于这些代码行,它会将数组中的所有值更改为2:

int value = 2;    
array[x][y] = value;

但是,我不怎么循环这个值,以使它随着再次调用该函数而增加。

#include <stdio.h> 
#include <stdlib.h>

#define ROW 3
#define COLUMN 3

int makePattern(int array[ROW][COLUMN],int x,int y);

int main(void) {
    int x,y;
    int count = 2;
    int i,j;

    int array[ROW][COLUMN] = {
        {'1','0','0'},{'0',};

    makePattern(array,0);

    for (i = 0; i < ROW; i++) {
        for (j = 0; j < COLUMN; j++) {
            printf("%d",array[i][j]);
        }

        printf("\n");
    }

    return 0;
}

int makePattern(int array[ROW][COLUMN],int y) {
    int value = 2;
    array[x][y] = value;

    for (value = 2; value < 9; value++) {
        if (x + 1 < ROW && array[x+1][y] == '0') {
            makePattern(array,x + 1,y);
        }

        if (x - 1 >= 0 && array[x - 1][y] == '0') {
            makePattern(array,x - 1,y);
        }

        if (y + 1 < COLUMN && array[x][y + 1] == '0') {
            makePattern(array,x,y + 1);
        }

        if (y - 1 >= 0 && array[x][y - 1] == '0') {
            makePattern(array,y - 1);
        }

        value++;
    }
}
XINXIN16666 回答:在C中的2d手机键盘上打印每个解锁图案

您在正确的轨道上,因为您使用3x3矩阵来跟踪状态(访问的节点并存储所采用的路径),x / y坐标表示当前位置并产生四个递归调用处理可能的移动方向(带有边界检查)。

但是,我不确定运行到9的循环是否会工作-这将导致每帧产生36个递归调用。在某些实现中这可能是可行的,但是我认为最简单的方法是将每个帧视为在给定x / y坐标对的情况下探索一个可能的方向,然后在从该正方形递归地探索了所有方向之后进行回溯(撤消移动)。每当我们执行最后一步时,我们都知道我们已经探索了所有方格,现在该打印当前的求解路径了。

这是实现此目的并基本上对尺寸进行硬编码的代码。一种练习是将代码通用化为任意大小的矩阵,然后返回将打印与遍历逻辑分开的路径。我还选择将状态移出main函数。

#include <stdbool.h>
#include <stdio.h>
#include <string.h>

static void print_unlock_patterns_r(int pad[3][3],int x,int y,int step) {
    int directions[][2] = {{1,0},{0,1},{-1,-1}};
    pad[y][x] = 1 + step;

    for (int i = 0; i < 4; i++) {
        int xp = x + directions[i][0];
        int yp = y + directions[i][1];

        if (xp >= 0 && xp < 3 && yp >= 0 && yp < 3 && !pad[yp][xp]) {
            print_unlock_patterns_r(pad,xp,yp,step + 1);
        }
    }

    if (step == 8) {
        for (int i = 0; i < 3; i++,puts("")) {
            for (int j = 0; j < 3; printf("%d",pad[i][j++]));
        }

        puts("");
    }    

    pad[y][x] = 0;
}

void print_unlock_patterns() {
    int pad[3][3];
    memset(pad,sizeof(pad));
    print_unlock_patterns_r(pad,0);
}

int main(void) {
    print_unlock_patterns();
    return 0;
}

输出:

123
894
765

123
874
965

123
654
789

129
438
567

145
236
987

189
276
345

187
296
345

167
258
349
本文链接:https://www.f2er.com/3141203.html

大家都在问