1. 程式人生 > >紫書——Spreadsheet Tracking UVA - 512

紫書——Spreadsheet Tracking UVA - 512

題解:

題目大意為 你輸入幾個操作,改變該表格。然後輸入原來的幾個點,輸出改變之後的位置或者gone(已被刪除)

直接操作表格比較難寫,所以思想就是先把操作和原來的點想記錄下來;

然後判斷每個點經過每個操作後的位置。書上都寫了這兩種方法。我的做法是第二個

 

#include <bits/stdc++.h>
using namespace std;

struct Node{	//儲存一開始的點數 
	int r;
	int c;
}node[100];

string opera[500];

void exope(int tim,int n){	//開始對第n個點進行t次操作 
	int isdel = 0; //判斷是否被del了 
	for(int i = 0; i < tim; i++){
		stringstream ss(opera[i]);
		string tmp;
		ss >> tmp;
		
		 
		if(!tmp.compare("DC") || !tmp.compare("DR")){
			int tno;
			if(tmp[1] == 'C') tno = node[n].c;
			else tno = node[n].r;
			
			int dell,isjud = tno; //jud是儲存沒改變之前r或者c的資料,dell則是要刪除的r、c 
			ss >> dell;	//去掉第一個 
			while(ss >> dell){
				if(dell == isjud){	isdel = 1;	break;	}
				else if(dell < isjud)	tno--;
			} 
			
			if(tmp[1] == 'C') node[n].c = tno;
			else node[n].r = tno;
		}else if(!tmp.compare("IC") || !tmp.compare("IR")){
			int tno;
			if(tmp[1] == 'C') tno = node[n].c;
			else tno = node[n].r;
			
			int dell,isjud = tno;
			ss >> dell;	//去掉第一個 
			while(ss >> dell){
				if(dell <= isjud)	tno++;
			} 
			
			if(tmp[1] == 'C') node[n].c = tno;
			else node[n].r = tno;
		}else{
			int r1,c1,r2,c2;
			ss >> r1 >> c1 >> r2 >> c2;
			if(node[n].r == r1 && node[n].c == c1){
				node[n].r = r2; node[n].c = c2;
			} else if(node[n].r == r2 && node[n].c == c2){
				node[n].r = r1; node[n].c = c1;
			}
		}	
	}
	
	if(isdel) printf("GONE\n");
	else printf("moved to (%d,%d)\n",node[n].r,node[n].c);
}

int main() {
	//freopen("in.txt","r",stdin);
	// freopen("out.txt","w",stdout);
	
	int rnd = 1;
	int curr,curc;	//一開始的行和列 
	while(scanf("%d%d",&curr,&curc) == 2 && curr){
		int ope;
		scanf("%d",&ope);
		getchar();
		for(int i = 0; i < ope; i++){
			getline(cin,opera[i]);
		}
		
		int dnum;
		scanf("%d",&dnum);
		
		for(int i = 0; i < dnum; i++){
			scanf("%d%d",&node[i].r,&node[i].c);
		}		//到這裡為止前面是為了記錄所有操作和點數
		
		if(rnd != 1) printf("\n");
		printf("Spreadsheet #%d\n",rnd++);
		
		for(int i = 0; i < dnum; i++){
			printf("Cell data in (%d,%d) ",node[i].r,node[i].c);
			exope(ope,i);
		} 
	} 
		
	return 0;
}