• uva 101 POJ 1208 The Blocks Problem 木块问题 vector模拟


    挺水的模拟题,刚开始题目看错了,poj竟然过了。。。无奈。uva果断wa了

    搞清题目意思后改了一下,过了uva。

    题目要求模拟木块移动:

    有n(0<n<25)快block,有5种操作:

    move a onto b  在将a搬到b上之前,先把a和b上的积木放回原來的位置

    move a over b在将a搬到b所在的那堆积木上前,先把a上的积木放回原來的位罝

    pile a onto b 将包括a本身和上方的积木一起放到b上,在放之前b上方的积木放回原来的位置

    pile a over b 将包括a本身和上放的积木一起搬到到b所在的那堆上 

    quit结束命令,前四个动作中若ab在同一堆中,则不做改变。


    我用的vector模拟,其实用线性表也不错的,纯当练习stl了。


    代码:

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    typedef vector<int>::iterator VI;
    
    vector <int> v[30];
    int rec[30];
    int n;
    
    VI Find(vector <int> &v, int num) {
    	for (VI i = v.begin(); i != v.end(); i++)
    		if (*i == num) {
    			return i;
    		}
    	return v.begin() - 1;
    }//find num in vector v
    
    void check() {
    /*	for (int i = 0; i < n; i++)
    		cout << rec[i] << ' ';
    	cout << endl;
    	*/
    	for (int i = 0; i < n; i++) {
    		cout << i << ':';
    		if (v[i].empty()) {
    			cout << endl;
    			continue;
    		}
    		cout << ' ' << v[i][0];
    		for (int j = 1; j < v[i].size(); j++)
    			cout << ' ' << v[i][j];
    		cout << endl;
    	}
    }
    
    int main() {
    	cin >> n;
    	for (int i = 0; i < n; i++) {
    		v[i].clear();
    		v[i].push_back(i);
    		rec[i] = i;
    	}//for init
    	string ts;
    	int tn1, tn2;
    	while (cin >> ts && ts != "quit") {
    		if (ts == "move") {
    			cin >> tn1 >> ts >> tn2;
    			if (rec[tn1] == rec[tn2]) continue;
    			while (v[rec[tn1]].back() != tn1) {
    				rec[v[rec[tn1]].back()] = v[rec[tn1]].back();
    				v[v[rec[tn1]].back()].push_back(v[rec[tn1]].back());
    				v[rec[tn1]].pop_back();
    			}
    			v[rec[tn1]].pop_back();
    			if (ts == "onto") {
    				VI i;
    				while (v[rec[tn2]].back() != tn2) {
    					rec[v[rec[tn2]].back()] = v[rec[tn2]].back();
    					v[v[rec[tn2]].back()].push_back(v[rec[tn2]].back());
    					v[rec[tn2]].pop_back();
    				}
    				v[rec[tn2]].push_back(tn1);
    				rec[tn1] = rec[tn2];
    			}//move onto
    			else {
    				v[rec[tn2]].push_back(tn1);
    				rec[tn1] = rec[tn2];
    		   	}//move over
    		}
    		else {
    			cin >> tn1 >> ts >> tn2;
    			if (rec[tn1] == rec[tn2]) continue;
    			if (ts == "onto") {
    				while (v[rec[tn2]].back() != tn2) {
    					rec[v[rec[tn2]].back()] = v[rec[tn2]].back();
    					v[v[rec[tn2]].back()].push_back(v[rec[tn2]].back());
    					v[rec[tn2]].pop_back();
    				}
    				VI pos1 = Find(v[rec[tn1]], tn1), pos2 = Find(v[rec[tn2]], tn2);
    				int tmp[25], cnt = 0;
    				for (VI i = v[rec[tn1]].end() - 1; i >= pos1; i--) {
    	//				cout << "*i=" << *i << endl;
    					tmp[cnt++] = *i;
    					v[rec[tn1]].erase(i);
    					rec[*i] = rec[tn2];
    				}
    				for (int i = 0; i < cnt / 2; i++) {
    					int t = tmp[i];
    					tmp[i] = tmp[cnt - i - 1];
    					tmp[cnt - i - 1] = t;
    				}
    					v[rec[tn2]].insert(pos2 + 1, tmp, tmp + cnt);
    				
    			}//pile onto
    			else {
    				VI pos1 = Find(v[rec[tn1]], tn1);
    				int tmp[25], cnt = 0;
    				for (VI i = v[rec[tn1]].end() - 1; i >= pos1; i--) {
    	//				cout << "*i=" << *i << endl;
    					tmp[cnt++] = *i;
    					v[rec[tn1]].erase(i);
    					rec[*i] = rec[tn2];
    				}
    				for (int i = 0; i < cnt / 2; i++) {
    					int t = tmp[i];
    					tmp[i] = tmp[cnt - i - 1];
    					tmp[cnt - i - 1] = t;
    				}
    					v[rec[tn2]].insert(v[rec[tn2]].end(), tmp, tmp + cnt);
    			}//pile over
    		}
    	}//while
    	check();
    	return 0;
    }


  • 相关阅读:
    第五篇:在SOUI中使用XML布局属性指引(pos, offset, pos2type)
    第四篇:SOUI资源文件组织
    第三篇:用SOUI能做什么?
    第二篇:SOUI源码的获取及编译
    第一篇:SOUI是什么?
    BuildFilePath 及打开文件对话框
    Java的synchronized关键字:同步机制总结
    Synchronized Methods
    java synchronized详解
    深拷贝与浅拷贝探析
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212119.html
Copyright © 2020-2023  润新知