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("\n");for(int i=0;i<num_comd;i++){printf("%c ",Vector[i]->comd[1]);}printf("\n"); }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\n",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;}elsereturn 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\n",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\n",q_row,q_col);return;}}ans_row=ans_row-d_r; //printf("ans_row=%d,ans_col=%d\n",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\n",q_row,q_col);return;}}ans_col=ans_col-d_c; //printf("ans_row=%d,ans_col=%d\n",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\n",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\n",ans_row,ans_col); }}}printf("Cell data in (%d,%d) moved to (%d,%d)\n",q_row,q_col,ans_row,ans_col);return; }int main() { #ifdef localfreopen("input.txt","r",stdin);freopen("out.txt","w",stdout); #endifwhile(read_comd()){ //print_Command();if(kase){printf("\n");}printf("Spreadsheet #%d\n",++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為好。
轉載于:https://www.cnblogs.com/TorettoRui/p/10398464.html
總結
- 上一篇: 2019区块链广泛应用于能源领域 ,DM
- 下一篇: 临时的js方法