https://www.cnblogs.com/violet-acmer/p/9664805.html
题意:
定义五个指令,判断能否从输入的n条指令中成功跳出循环,如果不能,输出"No",反之,输出"Yes"。
题解:
判断某个数[0,255]是否重复来到某一指令,如果有,则肯定是个无限循环,输出"No",反之,可以跳出循环,输出"Yes"。
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxn=1e4+10; 6 7 struct Order 8 { 9 int v; 10 int k; 11 char que[4]; 12 }; 13 Order order[maxn]; 14 int n; 15 int r; 16 bool vis[maxn][256];//vis[index][r] == true : 数r来到index两次,无限循环 17 18 void Initial() 19 { 20 scanf("%d",&n); 21 for(int i=1;i <= n;++i) 22 { 23 scanf("%s%d",order[i].que,&order[i].v); 24 if(order[i].que[0] != 'a') 25 scanf("%d",&order[i].k); 26 } 27 r=0; 28 memset(vis,false,sizeof(vis)); 29 } 30 bool is_vis(int index,int r) 31 { 32 if(vis[index][r] == false) 33 { 34 vis[index][r]=true; 35 return false; 36 } 37 return true; 38 } 39 bool Process() 40 { 41 int index=1; 42 while(index <= n) 43 { 44 if(order[index].que[1] == 'd') 45 { 46 r += order[index].v; 47 r %= 256; 48 if(is_vis(index,r) == true) 49 return false; 50 } 51 if(is_vis(index,r) == true)//判断某数r是否重复来到某index指令 52 return false; 53 54 if(order[index].que[1] == 'e') 55 index=(r == order[index].v ? order[index].k:index+1); 56 else if(order[index].que[1] == 'n') 57 index=(r != order[index].v ? order[index].k:index+1); 58 else if(order[index].que[1] == 'l') 59 index=(r < order[index].v ? order[index].k:index+1); 60 else if(order[index].que[1] == 'g') 61 index=(r > order[index].v ? order[index].k:index+1); 62 } 63 return true; 64 } 65 int main() 66 { 67 int T; 68 scanf("%d",&T); 69 while(T--) 70 { 71 Initial(); 72 if(Process()) 73 printf("Yes\n"); 74 else 75 printf("No\n"); 76 } 77 return 0; 78 }