2018 青島網路賽C題Halting Problem
判斷一個指定的程式是一直執行下去還是會停止。停止好判斷,就是如何判斷是否會一直執行下去。當第二次到達第n步的時候,如果此時的r仍然是第一次到達第n步時候的r,那麼這個程式會一直執行下去。
通過這道題還知道了對bool型別的陣列處理是比對int型別的陣列處理快的。全域性變數是比區域性變數可以申請的記憶體多的。
程式碼:
#include <iostream> #include <cstring> using namespace std; const int inf=1e4+7; bool a[10003][257]; //全域性變數。 struct node { string str; int v,k; }arr[inf]; //還要考慮只有一條語句的時候。也就是沒有add的時候。迴圈的時候一直沒變。
int main() { int T,n; scanf("%d",&T); while(T--) { int flag=0; scanf("%d",&n); for(int i=1;i<=n;i++) { cin>>arr[i].str ; scanf("%d",&arr[i].v); if(arr[i].str !="add") scanf("%d",&arr[i].k ); } int p=1,flag1=0,r=0; memset(a,0,sizeof(a)); int i=1,j,k; while( p!=n+1 ) { if( a[p][r] ==1 ) { printf("No\n"); goto x; } a[p][r]=1; if(arr[p].str =="add") { r=(r+arr[p].v )%256; p=p+1; } else if(arr[p].str =="beq") { if(arr[p].v ==r) p=arr[p].k ; else p=p+1; } else if(arr[p].str =="bne") { if(arr[p].v!=r) p=arr[p].k; else p=p+1; } else if(arr[p].str =="blt") { if(r<arr[p].v) p=arr[p].k; else p=p+1; } else if(arr[p].str=="bgt") { if(r>arr[p].v) p=arr[p].k; else p=p+1; } } printf("Yes\n"); x:; } return 0; }