题目链接: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;
}
}