标签:acm class tle src mes std ios int 数字
题目链接: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 }
2019河北省大学生程序设计竞赛(重现赛) L题-smart robot(深度优先搜索)
标签:acm class tle src mes std ios int 数字
原文地址:https://www.cnblogs.com/Carered/p/10926136.html