POJ-3050-Hoscotch

这是一道简单的深搜题目,题意说的是给一个5*5的棋盘,里面填满数字,然后跳到一个格子上,这是第一步,接着向上下左右四个方向任意一个方向走一步,一共走6步,问我们走过的数字组成的一个6位数有多少种不同的方案。
那这就是一个集合嘛,集合中没有相同的元素,直接输出集合的尺寸就行了。
我们同样也可以通过打vis标记来做都可以,纯c加O(1)的查询还是快一些。
这也验证了一件事,格子中的的数字都是个位数。
这个是可以退出的,当我们所以的点走完之后就自然退出了,因为for循环结束之后,整个dfs就结束了。

#include <cstdio>
#include <cstring>
// #include <set>
using namespace std;
// set<int> st;
int a[6][6], cnt=0;
int d[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
bool vis[1000010];

void dfs(int x,int y,int k,int num)
{
    if (k==6) {
        // st.insert(num);
        if (!vis[num]) {
            vis[num] = 1;
            cnt++;
        }
        return;
    }
    for (int i = 0; i < 4;i++) {
        int nx = x + d[i][0];
        int ny = y + d[i][1];
        if (nx<5&&ny<5&&nx>=0&&ny>=0) {
            k++;
            dfs(nx, ny, k, num * 10 + a[nx][ny]);
            k--;
        }
    }
}

int main()
{
    for (int i = 0; i < 5;i++) {
        for (int j = 0; j < 5;j++) {
            scanf("%d", &a[i][j]);
        }
    }
    memset(vis, 0, sizeof(vis));
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            dfs(i, j, 1, a[i][j]);
        }
    }
    printf("%d
", cnt);
    // printf("%d
", st.size());
    return 0;
}
原文地址:https://www.cnblogs.com/xyqxyq/p/10397198.html