UVA512B
Posted torettorui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA512B相关的知识,希望对你有一定的参考价值。
这种方式和之前的思路不一样,主要是先保存comd,然后再一个一个模拟。
下面贴出我写出的代码
//其实这种方式不一定比那种方式效率高 //这种方式适合于表格比较多,但是查询的cell比较少的情况 //那种情况适合于查询的cell比较多的情况 #include<cstdio> #include<vector> using namespace std; struct Command { char comd[3]; int r1,c1,r2,c2; int num; int r_c[15]; }; vector<Command*>Vector; int row_original,col_original,row_now,col_now,num_comd,num_query,q_row,q_col,ans_row,ans_col,kase=0;//没有必要保存各个需要查询的query,可以边遍历边查询 void print_Command() { printf(" "); for(int i=0;i<num_comd;i++) { printf("%c ",Vector[i]->comd[1]); } printf(" "); } void clear_Vec() { for(int i=0;i<num_comd;i++) { delete Vector[i]; } Vector.clear(); } bool read_comd() { clear_Vec(); if(scanf("%d%d%d",&row_original,&col_original,&num_comd)==3&&row_original) { //printf("%d%d%d ",row_original,col_original,num_comd); for(int i=0;i<num_comd;i++) { Command *u=new Command; scanf("%s",u->comd); //printf("%s",u->comd); if(u->comd[0]==‘E‘) { scanf("%d%d%d%d",&u->r1,&u->c1,&u->r2,&u->c2); Vector.push_back(u); } else { scanf("%d",&u->num); for(int i=0;i<u->num;i++) { scanf("%d",&u->r_c[i]); } Vector.push_back(u); } } return true; } else return false; } void simulate() { ans_row=q_row; ans_col=q_col; for(int i=0;i<num_comd;i++) { if(Vector[i]->comd[0]==‘E‘) { if(Vector[i]->r1==ans_row&&Vector[i]->c1==ans_col) { ans_row=Vector[i]->r2; ans_col=Vector[i]->c2; } else if(Vector[i]->r2==ans_row&&Vector[i]->c2==ans_col) { ans_row=Vector[i]->r1; ans_col=Vector[i]->c1; } //printf("ans_row=%d,ans_col=%d ",ans_row,ans_col); } if(Vector[i]->comd[0]==‘D‘) { if(Vector[i]->comd[1]==‘R‘) { int d_r=0; for(int j=0;j<Vector[i]->num;j++) { if(Vector[i]->r_c[j]<ans_row) { d_r++; } if(Vector[i]->r_c[j]==ans_row) { printf("Cell data in (%d,%d) GONE ",q_row,q_col); return; } } ans_row=ans_row-d_r; //printf("ans_row=%d,ans_col=%d ",ans_row,ans_col); } if(Vector[i]->comd[1]==‘C‘) { int d_c=0; for(int j=0;j<Vector[i]->num;j++) { if(Vector[i]->r_c[j]<ans_col) { d_c++; } if(Vector[i]->r_c[j]==ans_col) { printf("Cell data in (%d,%d) GONE ",q_row,q_col); return; } } ans_col=ans_col-d_c; //printf("ans_row=%d,ans_col=%d ",ans_row,ans_col); } } if(Vector[i]->comd[0]==‘I‘) { if(Vector[i]->comd[1]==‘R‘) { int d_r=0; for(int j=0;j<Vector[i]->num;j++) { if(Vector[i]->r_c[j]<=ans_row) { d_r++; } } ans_row=ans_row+d_r; //printf("ans_row=%d,ans_col=%d ",ans_row,ans_col); } if(Vector[i]->comd[1]==‘C‘) { int d_c=0; for(int j=0;j<Vector[i]->num;j++) { if(Vector[i]->r_c[j]<=ans_col) { d_c++; } } ans_col=ans_col+d_c; //printf("ans_row=%d,ans_col=%d ",ans_row,ans_col); } } } printf("Cell data in (%d,%d) moved to (%d,%d) ",q_row,q_col,ans_row,ans_col); return; } int main() { #ifdef local freopen("input.txt","r",stdin); freopen("out.txt","w",stdout); #endif while(read_comd()) { //print_Command(); if(kase) { printf(" "); } printf("Spreadsheet #%d ",++kase); scanf("%d",&num_query); for(int i=0;i<num_query;i++) { scanf("%d%d",&q_row,&q_col); simulate(); } } return 0; }
在这道题中,如代码的注释部分,适用于cell比较少的情况,要不然cell比较多的话,一个一个进行模拟,非常的浪费时间。
学到的一点就是,Vector中如果要保存结构体,那么必须写成vector<*struct>,将vector初始化的时候,不能直接vector.clear(),而要先回收各个内存,然后再clear();
还想说一点就是,调试的时候,可以直接在判断代码出断电调试,会比较的快,虽然之前我一直在用。
汝佳大神的代码使用的不是Vector,而是数组,我觉得这种没有明确告诉数量上限的还是使用vector为好。
以上是关于UVA512B的主要内容,如果未能解决你的问题,请参考以下文章