2019CCPC河北省大学生程序设计竞赛 - L - smart robot(dfs)

题目链接:https://ac.nowcoder.com/acm/contest/903/L

题意:给你 n * n的方阵,你可以从任意一个数字开始走,可以走上下左右四个方向,走过的数字会被拼合,拼合的数字没有前导0,问最小不能拼合出来的数字是多少?

思路:把每个数字作为起点开始dfs,把已经搜索过的数字进行标记,然后从0开始检索,输出第一个未出现的数字就是答案。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 + 7;
int vis[N];
int a[100][100], n;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
void dfs(int x, int y, int step, int v)
{
    vis[v] = 1;
    if(step == 5) return;
    for(int i = 0; i < 4; i++)
    {
        int dx = x + dir[i][0];
        int dy = y + dir[i][1];
        if(dx >= 1 && dx <= n && dy >= 1 && dy <= n)
        dfs(dx,dy,step+1,v*10+a[dx][dy]);
    }
}
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            cin >> a[i][j];
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            dfs(i,j,1,a[i][j]);
    for(int i = 0;; i++)
    if(!vis[i])
    {
        cout << i << endl;
        return 0;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值