UVa 101 - The Blocks Problem
2012-07-30 16:40
316 查看
模拟栈,这个题并不难,注意a、b积木相同时情况的处理就可以,但至今都不明白当时为什么RE了那么多遍,数组cn开小了就RE,但按题目说最多开个cn[25][25]的数组就足够了,但我开到100多还是RE,结果一下开到200多就AC了,至今不知道是为什么,求大神解释啊~~~
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct blocks { int m,n; char a[10]; char b[10]; } AI[1000+5]; int cn[250+5][250+5],ct[250+5]; // 数组? int sfind(int num,int m) //查找相应积木 { for(int i=0; i<num; i++) for(int j=0; j<ct[i]; j++) if(cn[i][j]==m) return i; return 0; } int change(int flagm,int m) //将相应积木放回原处 { for(int i=ct[flagm]-1; i>=0; i--) if(cn[flagm][i]!=m) { int ggt=cn[flagm][i]; cn[ggt][ct[ggt]++]=cn[flagm][i]; ct[flagm]--; } else break; return 0; } int monto(int m,int n,int num) { int flagm,flagn; flagm=sfind(num,m); flagn=sfind(num,n); change(flagm,m); change(flagn,n); cn[flagn][ct[flagn]++]=cn[flagm][--ct[flagm]]; return 0; } int mover(int m,int n,int num) { int flagm,flagn; flagm=sfind(num,m); flagn=sfind(num,n); change(flagm,m); cn[flagn][ct[flagn]++]=cn[flagm][--ct[flagm]]; return 0; } int ponto(int m,int n,int num) { int flagm,flagn,flaga; flagn=sfind(num,n); flagm=sfind(num,m); change(flagn,n); for(int i=0; i<ct[flagm]; i++) if(m==cn[flagm][i]) { flaga=i; break; } for(int i=flaga; i<ct[flagm]; i++) cn[flagn][ct[flagn]++]=cn[flagm][i]; ct[flagm]-=ct[flagm]-flaga; return 0; } int pover(int m,int n,int num) { int flagm,flagn,flaga; flagn=sfind(num,n); flagm=sfind(num,m); for(int i=0; i<ct[flagm]; i++) if(m==cn[flagm][i]) { flaga=i; break; } for(int i=flaga; i<ct[flagm]; i++) cn[flagn][ct[flagn]++]=cn[flagm][i]; ct[flagm]-=ct[flagm]-flaga; return 0; } int main() { #ifdef test freopen("sample.txt","r",stdin); #endif int num; while(scanf("%d",&num)!=EOF) { int count=0; while(1) { getchar(); scanf("%s",AI[count].a); if(strcmp(AI[count].a,"quit")==0) break; scanf(" %d %s %d",&AI[count].m,AI[count].b,&AI[count].n); count++; } for(int i=0; i<num; i++) { cn[i][0]=i; ct[i]=1; } for(int i=0; i<count; i++) { int flagm,flagn; flagn=sfind(num,AI[i].n); flagm=sfind(num,AI[i].m); if(flagm==flagn||AI[i].n==AI[i].m) continue; //四种情况 if(strcmp(AI[i].a,"move")==0&&strcmp(AI[i].b,"onto")==0) monto(AI[i].m,AI[i].n,num); else if(strcmp(AI[i].a,"move")==0&&strcmp(AI[i].b,"over")==0) mover(AI[i].m,AI[i].n,num); else if(strcmp(AI[i].a,"pile")==0&&strcmp(AI[i].b,"onto")==0) ponto(AI[i].m,AI[i].n,num); else if(strcmp(AI[i].a,"pile")==0&&strcmp(AI[i].b,"over")==0) pover(AI[i].m,AI[i].n,num); } for(int i=0; i<num; i++) { printf("%d:",i); for(int j=0; j<ct[i]; j++) printf(" %d",cn[i][j]); puts(""); } } return 0; }
相关文章推荐
- UVa 101 - The Blocks Problem(积木问题,指令操作)
- UVA101 HDU1612 POJ1208 The Blocks Problem
- Uva 101 - The Blocks Problem
- UVa 101 The Blocks Problem Vector基本操作
- UVA101 The Blocks Problem (数据结构模拟)
- uva 101 The Blocks Problem
- uva101木块问题The Blocks Problem
- UVA - 101 The Blocks Problem
- UVA101- The Blocks Problem
- Uva 101 The Blocks Problem
- uva 101 The Blocks Problem
- UVa 101 The Blocks Problem Vector基本操作
- UVA 101 The Blocks Problem
- UVa 101 The Blocks Problem(vector)
- UVa 101 The Blocks Problem
- UVA 101 The Blocks Problem【vector】
- uva_101 - The Blocks Problem
- uva 101 - The Blocks Problem
- UVa Problem 101 - The Blocks Problem
- uva 101 - The Blocks Problem