题目链接:https://ac.nowcoder.com/acm/contest/903/L
题意:给你 n * n的方阵,你可以从任意一个数字开始走,可以走上下左右四个方向,走过的数字会被拼合,拼合的数字没有前导0,问最小不能拼合出来的数字是多少?
思路:开始就认为是一道深搜题,后面自己想太多就没去试,醉了orz! 这题就是把每个数字作为起点开始搜索,把已经搜索过的数字进行标记,然后从0开始检索,输出第一个未出现的数字就是答案。搜索的话我代码是搜5位数的所有组合,事实上这道题搜索3位数的所有组合就能过,搜索6位数就会TLE。下图是我的测试图:
AC代码:
1 #include<cstdio>
2 #include<iostream>
3 #include<set>
4 #include<cstring>
5 using namespace std;
6 int n;
7 int vis[60][60];
8 int dx[4] = {0,1,0,-1};
9 int dy[4] = {-1,0,1,0};
10 set< int > st;
11 bool check(int x,int y)
12 {
13 if(x >= 0 && x < n && y >= 0 && y < n) return true;
14 else return false;
15 }
16 void dfs(int x,int y,int ans,int dep)
17 {
18 st.insert(ans);
19 for(int i = 0;i < 4;i++)
20 {
21 int nx = x + dx[i],ny = y + dy[i];
22 if(check(nx,ny) && dep > 0)
23 dfs(nx,ny,ans*10 + vis[nx][ny],dep-1);
24 }
25 }
26 int main()
27 {
28 scanf("%d",&n);
29 for(int i = 0;i < n;i++)
30 {
31 for(int j = 0 ;j < n;j ++)
32 {
33 scanf("%d",&vis[i][j]);
34 }
35 }
36 for(int i = 0;i < n;i++)
37 {
38 for(int j = 0 ;j < n;j ++)
39 {
40 dfs(i,j,vis[i][j],5);//这里搜索5位数的组合
41 }
42 }
43 int cnt = 0;
44 while(st.count(cnt) != 0) cnt++;
45 cout << cnt << endl;
46 st.clear();
47 return 0;
48 }
来源:oschina
链接:https://my.oschina.net/u/4411233/blog/3524074