首页 > 代码库 > [ZOJ 1011] NTA (dfs搜索)
[ZOJ 1011] NTA (dfs搜索)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1011
题目大意:在一棵树上,给你起始状态,问你能否到达终止状态。
给了树的前序遍历序。
直接dfs搜索。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <string> 4 #include <iostream> 5 #include <cstring> 6 #include <algorithm> 7 #include <sstream> 8 #include <cctype> 9 #include <vector> 10 #include <map> 11 #include <set> 12 #include <iterator> 13 #include <functional> 14 #include <cmath> 15 #include <numeric> 16 #include <ctime> 17 using namespace std; 18 typedef long long LL; 19 typedef pair<int,int> PII; 20 typedef vector<int> VI; 21 #define PB push_back 22 #define MP make_pair 23 #define SZ size() 24 #define CL clear() 25 #define AA first 26 #define BB second 27 #define EPS 1e-8 28 #define ZERO(x) memset((x),0,sizeof(x)) 29 const int INF = ~0U>>1; 30 const double PI = acos(-1.0); 31 32 int n,m,k; 33 char in[1000]; 34 vector<PII> v[1000][1000]; 35 int tree[10000]; 36 char ch[2]; 37 38 bool isAccepted(int sig){ 39 return sig>=n-m; 40 } 41 42 bool dfs(int rt,int sig){ 43 // printf("rt = %d sig = %d\n",rt,sig); 44 45 int rtVal = tree[rt]; 46 47 if( rtVal==-1 ){ 48 return isAccepted(sig); 49 } 50 // printf("rtVal = %d\n",rtVal); 51 bool res = false; 52 for(int i=0;i<v[sig][rtVal].SZ;i++){ 53 res = dfs(rt<<1,v[sig][rtVal][i].AA); 54 if(!res) continue; 55 res &= dfs(rt<<1|1,v[sig][rtVal][i].BB); 56 if( res ) break; 57 } 58 59 return res; 60 } 61 62 int main(){ 63 int kase = 1; 64 while( scanf("%d%d%d",&n,&m,&k)!=EOF ){ 65 getchar(); 66 for(int i=0;i<1000;i++) for(int j=0;j<1000;j++) v[i][j].CL; 67 if( n==0&&m==0&&k==0 ) break; 68 for(int i=0;i<n;i++){ 69 for(int j=0;j<k;j++){ 70 gets(in); 71 istringstream sss(in); 72 int a,b; 73 while( sss>> a >> b ){ 74 v[i][j].PB(MP(a,b)); 75 // printf("v[%d][%d].PB(%d,%d)\n",i,j,a,b); 76 } 77 } 78 } 79 // puts("*****"); 80 if( kase!=1 ) puts(""); 81 printf("NTA%d:\n",kase++); 82 int q; 83 while( true ){ 84 memset(tree,-1,sizeof(tree)); 85 scanf("%d",&q); 86 if( q==-1 ) break; 87 for(int i=1;i<=(1<<(q+1))-1;i++){ 88 scanf("%s",&ch); 89 if( strcmp(ch,"*")==0 ){ 90 tree[i] = -1; 91 } else { 92 tree[i] = ch[0]-‘a‘; 93 } 94 // printf("%d ",tree[i]); 95 }//puts(""); 96 97 bool ok = dfs(1,0); 98 if(ok) puts("Valid"); 99 else puts("Invalid");100 }101 102 }103 return 0;104 }
[ZOJ 1011] NTA (dfs搜索)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。