2019河北省大学生程序设计竞赛(重现赛) L题-smart robot(深度优先搜索)

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

2019河北省大学生程序设计竞赛(重现赛) L题-smart robot(深度优先搜索)_第1张图片

2019河北省大学生程序设计竞赛(重现赛) L题-smart robot(深度优先搜索)_第2张图片


 

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

思路:开始就认为是一道深搜题,后面自己想太多就没去试,醉了orz! 这题就是把每个数字作为起点开始搜索,把已经搜索过的数字进行标记,然后从0开始检索,输出第一个未出现的数字就是答案。搜索的话我代码是搜5位数的所有组合,事实上这道题搜索3位数的所有组合就能过,搜索6位数就会TLE。下图是我的测试图:

2019河北省大学生程序设计竞赛(重现赛) L题-smart robot(深度优先搜索)_第3张图片

AC代码:

 

 1 #include
 2 #include
 3 #include<set>
 4 #include
 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 }

 

转载于:https://www.cnblogs.com/Carered/p/10926136.html

你可能感兴趣的:(数据结构与算法)