1. 程式人生 > >2018 青島網路賽C題Halting Problem

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; }