题目
Tri_integral Summer Training 4
题意:
一个程序,按照当前的参数执行的顺序也不一样。对于所有可能的参数,检测题目给出的执行顺序是否可能。
题解:
模拟……有2种infeasible的情况:
1、没有数据能满足执行顺序(前后矛盾)。
2、没有正确返回,比如返回后应该执行11的,却跑到21去了,反过来也一样。
//Time:46ms //Memory:0KB //Length:2184B #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #include <queue> #include <algorithm> using namespace std; #define MAXN (1<<17) int pr[MAXN],ptop; bool check(int a,int b,int &v,int &h) { for(++h;;++h) switch(pr[h]) { case 3: if(a>2) return false; v=b+1; break; case 4: if(a<=2) return false; break; case 6: if(a<=b) return false; ++v; break; case 7: if(a>b) return false; break; case 8: --v; break; case 10: if(a>=b+1) return false; if(!check(a-1,b,v,h)) return false; if(pr[h+1]!=11) return false; break; case 11: return false; if(!check(a-2,v,v,h)) return false; if(pr[h+1]!=14) return false; break; case 12: if(a<b+1) return false; break; case 13: if(!check(a-3,v,v,h)) return false; if(pr[h+1]!=14) return false; break; case 15: return true; } return false; } int main() { //freopen("/home/moor/Code/input","r",stdin); int ncase,tmp; bool flag; scanf("%d",&ncase); while(ncase--) { flag=0; for(int i=0;i<5;++i) scanf("%d",&pr[i]); for(ptop=0;;++ptop) { scanf("%d",&pr[ptop]); if(pr[ptop]==21) break; } for(int x=0;x<=20&&!flag;++x) for(int y=0;y<=100&&!flag;++y) { int th=-1; tmp=0; flag=check(x,y,tmp,th); if(pr[th+1]!=21) flag=0; } printf("%s\n",flag?"feasible":"infeasible"); } return 0; }