2912: 练65.2 跳房子

内存限制:64 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:1 解决:1

题目描述

奶牛们按不太传统的方式玩起了小孩子们玩的"跳房子"游戏。奶牛们创造了一个$5×5$的、由与$x$,$y$轴平行的数字组成的直线型网格,而不是用来在里面跳的、线性排列的、带数字的方格。 然后他们熟练地在网格中的数字中跳:向前跳、向后跳、向左跳、向右跳(从不斜过来跳),跳到网格中的另一个数字上。他们再这样跳啊跳(按相同规则),跳到另外一个数字上(可能是已经跳过的数字)。 一共在网格内跳过五次后,他们的跳跃构建了一个六位整数(可能以$0$开头,例如$000201$)。 求出所有能被这样创造出来的不同整数的总数。

输入

第$1$到$5$行: 这样的网格,一行$5$个整数。

输出

第$1$行: 能构建的不同整数的总数。

样例输入 复制

1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 2 1
1 1 1 1 1

样例输出 复制

15

提示

#include<bits/stdc++.h>

using namespace std;
int Map[5][5];
int dx[] = {1,-1,0,0};
int dy[] = {0,0,1,-1};
set <int> res;
void dfs(int x, int y, int step, int number) {
    if (step == 5) {
        res.insert(number);
        return;
    }
    for (int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if (0 <= nx && nx < 5 && 0 <= ny && ny < 5) {
            dfs(nx, ny, step + 1, 10 * number + Map[nx][ny]);
        }
    }
}
int main() {
    for (int i = 0; i < 5; i++)
        for (int j = 0; j < 5; j++)
            cin >> Map[i][j];
    res.clear();
    for (int i = 0; i < 5; i++)
        for (int j = 0; j < 5; j++)
            dfs(i, j, 0, Map[i][j]);
    cout << res.size() << endl;
    return 0;
}