栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 1768 Hang or not to hang

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 1768 Hang or not to hang

#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<set>#include<stack>#include<list>#include<queue>#define eps 1e-6#define INF 0x1f1f1f1f#define PI acos(-1.0)#define ll __int64#define lson l,m,(rt<<1)#define rson m+1,r,(rt<<1)|1using namespace std;bool vis[16][1<<15],vv[32]; //映射后只有这么多的寄存器能影响int map1[32]; //将状态映射过来char save[16][10]; //保存命令int can1[16],can2[16],n,m,ans,ss; //参数vector<int>jz;vector<int>hav[32];int  bin[40]; //将每一个寄存器对应的值保存下来int cal(char * a) //返回该命令的参数个数{   if(!strcmp(a,"NOT")||!strcmp(a,"RANDOM")||!strcmp(a,"JMP"))         return 1;   if(!strcmp(a,"STOP"))         return 0;   return 2;}void dfs(int cur){   for(int i=0;i<hav[cur].size();i++)   {      if(vv[hav[cur][i]])         continue;      //printf("cur:%d->%dn",cur,hav[cur][i]);      vv[hav[cur][i]]=true;      map1[hav[cur][i]]=m;      m++;      dfs(hav[cur][i]);   }   return ;}void Dfs(int sta,int i,int ss){   if(i>=n)      return ;   if(vis[i][sta])      return ;   ss++;   vis[i][sta]=true;   int T=sta;   if(!strcmp(*(save+i),"AND"))   {      int a=map1[can1[i]],b=map1[can2[i]]; //取出对应的离散化的位置      if(a==-1||b==-1) //遇到无效状态,直接跳过      {         Dfs(sta,i+1,ss);         vis[i][sta]=false; //从前往后就不用回溯,因为后面的情况一定比当前坏         return ;      }      int tt=sta;      int aa=(tt>>a)&1,bb=(tt>>b)&1; //取出两寄存器的数      if(aa&bb) //运算,并把结果加进去         tt=tt|bin[a];      else         tt=tt-(aa<<a);      Dfs(tt,i+1,ss);   }   else if(!strcmp(*(save+i),"OR"))   {      int a=map1[can1[i]],b=map1[can2[i]]; //取出对应的离散化的位置      if(a==-1||b==-1)      {         Dfs(sta,i+1,ss);         vis[i][sta]=false;         return ;      }      int tt=sta;      int aa=(tt>>a)&1,bb=(tt>>b)&1;      if(aa|bb)         tt=tt|bin[a];      else         tt=tt-(aa<<a);      Dfs(tt,i+1,ss);   }   else if(!strcmp(*(save+i),"XOR"))   {      int a=map1[can1[i]],b=map1[can2[i]]; //取出对应的离散化的位置      if(a==-1||b==-1)      {         Dfs(sta,i+1,ss);         vis[i][sta]=false;         return ;      }      int tt=sta;      int aa=(tt>>a)&1,bb=(tt>>b)&1;      if(aa^bb)         tt=tt|bin[a];      else         tt=tt-(aa<<a);      Dfs(tt,i+1,ss);   }   else if(!strcmp(*(save+i),"NOT"))   {      int a=map1[can1[i]];      if(a==-1)      {         Dfs(sta,i+1,ss);         vis[i][sta]=false;         return ;      }      sta=sta^bin[a]; //取反      Dfs(sta,i+1,ss);   }   else if(!strcmp(*(save+i),"MOV"))   {      int a=map1[can1[i]],b=map1[can2[i]];      if(a==-1||b==-1)      {         Dfs(sta,i+1,ss);         vis[i][sta]=false;         return ;      }      int aa=(sta>>b)&1;      if(aa)         sta=sta|bin[a];      else         sta=sta&((bin[m]-1)-bin[a]); //把第a个寄存器清零      Dfs(sta,i+1,ss);        }   else if(!strcmp(*(save+i),"SET"))   {      int a=map1[can1[i]],b=can2[i];      if(a==-1)      {         Dfs(sta,i+1,ss);         vis[i][sta]=false;         return ;      }      if(b)         sta=sta|(1<<a);      else         sta=sta&((bin[m]-1)-bin[a]);      Dfs(sta,i+1,ss);        }   else if(!strcmp(*(save+i),"JMP"))   {      int a=can1[i];      Dfs(sta,a,ss);   }   else if(!strcmp(*(save+i),"JZ"))   {      int a=can1[i],b=map1[can2[i]];      int bb=(sta>>b)&1; //一定是影响寄存器      if(!bb)      {         Dfs(sta,a,ss);         vis[i][sta]=false;         return ;      }      Dfs(sta,i+1,ss);   }   else if(!strcmp(*(save+i),"STOP"))   {      if(ss<ans)         ans=ss;   }   else if(!strcmp(*(save+i),"RANDOM"))   {      int a=map1[can1[i]];      if(a==-1)      {         Dfs(sta,i+1,ss);         vis[i][sta]=false;         return ;      }      Dfs(sta|bin[a],i+1,ss); //置1      Dfs(sta&(bin[m]-1-bin[a]),i+1,ss); //置0   }   vis[i][T]=false;}int main(){     for(int i=0;i<=35;i++)      bin[i]=(1<<i);   while(scanf("%d",&n)!=EOF)   {      memset(map1,-1,sizeof(map1));      memset(vv,false,sizeof(vv));      jz.clear();      for(int i=0;i<32;i++)         hav[i].clear();      for(int i=0;i<n;i++)      {          scanf("%s",save+i);          int t=cal(*(save+i));          if(t==1)  scanf("%d",&can1[i]);          else if(t==2)          {  scanf("%d%d",&can1[i],&can2[i]);  if(!strcmp(*(save+i),"JZ"))  {     jz.push_back(can2[i]);  //从这点开始扫描有影响的状态     continue;  }  if(strcmp(*(save+i),"SET"))    //set命令不影响     hav[can1[i]].push_back(can2[i]);  //寄存器2能影响寄存器1          }      }      m=0;       for(int i=0;i<jz.size();i++)       {         if(!vv[jz[i]])         { map1[jz[i]]=m; m++; vv[jz[i]]=true; dfs(jz[i]);         }      }ans=INF;      memset(vis,false,sizeof(vis));  for(int i=0;i<=bin[m]-1;i++) Dfs(i,0,0); //这样写不用回溯          if(ans==INF)         printf("HANGSn");      else         printf("%dn",ans);   }   return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/374776.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号