halting_problem zoj 2018 ACM-ICPC qingdao
阿新 • • 發佈:2018-11-15
本題就是一個模擬 用bool陣列判重
如果在執行程式碼的過程中 再次回到標記處 說明出現了迴圈結構
此時死迴圈出現 直接break 輸出no
至於為啥不在if後面直接mark
那是因為add操作一次後再進入迴圈
r的值是暫未改變 直接被判斷為死迴圈 break
#include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<iostream> #define maxn 10005 #define clr(a,b) memset(a,b,sizeof(a)); using namespace std; struct node { int id,v,k; }que[maxn]; bool visit[maxn][257]; int main() { int t; scanf("%d",&t); while(t--) { clr(visit,0) int n; scanf("%d",&n); for(int i=1;i<=n;i++) { string str; int v,k; cin>>str; if(str=="add") { scanf("%d",&v); que[i].id=1; que[i].v=v; } if(str=="beq") { scanf("%d %d",&v,&k); que[i].id=2; que[i].v=v; que[i].k=k; } if(str=="bne") { scanf("%d %d",&v,&k); que[i].id=3; que[i].v=v; que[i].k=k; } if(str=="blt") { scanf("%d %d",&v,&k); que[i].id=4; que[i].v=v; que[i].k=k; } if(str=="bgt") { scanf("%d %d",&v,&k); que[i].id=5; que[i].v=v; que[i].k=k; } } int loc=1,r=0,flag=1; while(1) { if(visit[loc][r]) { flag=0; break; } else visit[loc][r]=1; if(loc==n+1) break; if(que[loc].id==1) { r=(r+que[loc].v)%256; loc++; continue; } if(que[loc].id==2) { if(que[loc].v==r) loc=que[loc].k; else loc++; continue; } if(que[loc].id==3) { if(que[loc].v!=r) loc=que[loc].k; else loc++; continue; } if(que[loc].id==4) { if(que[loc].v>r) loc=que[loc].k; else loc++; continue; } if(que[loc].id==5) { if(que[loc].v<r) loc=que[loc].k; else loc++; continue; } } if(flag) printf("Yes\n"); else printf("No\n"); } }