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 if(is_vis(index,r)) 47 return false; 48 49 r += order[index++].v; 50 r %= 256; 51 continue; 52 } 53 if(is_vis(index,r) == true)//判断某数r是否重复来到某index指令 54 return false; 55 56 if(order[index].que[1] == 'e') 57 index=(r == order[index].v ? order[index].k:index+1); 58 else if(order[index].que[1] == 'n') 59 index=(r != order[index].v ? order[index].k:index+1); 60 else if(order[index].que[1] == 'l') 61 index=(r < order[index].v ? order[index].k:index+1); 62 else if(order[index].que[1] == 'g') 63 index=(r > order[index].v ? order[index].k:index+1); 64 } 65 return true; 66 } 67 int main() 68 { 69 int T; 70 scanf("%d",&T); 71 while(T--) 72 { 73 Initial(); 74 if(Process()) 75 printf("Yes "); 76 else 77 printf("No "); 78 } 79 return 0; 80 }