移动盒子(Boxes in a Line, UVa 12657) 关于STL中list(双向链表的应用)


input:
6 4
1 1 4
2 3 5
3 1 6
4
6 3
1 1 4
2 3 5
3 1 6
100000 1
4

output:
Case1:12
Case2:9
Case3:2500050000



//由于进uva评测总是出问题,所以一下代码只是通过以上测试用例,没有实际评测AC过,不过思路大概差不多
//题目比较简单,作为STL的list容器的练习很合适
#include<iostream>
#include<string>
#include<vector> 
#include<iomanip> 
#include<stack> 
#include<list>
#include<algorithm>
using namespace std; 
int main(){
	int kl = 1;//作为case的序号 
	int n,m;
	while(cin>>n>>m){//箱子n,指令数m
    list<int>li; 
	for(int i=1;i<n+1;i++){//初始化链表 
		li.push_back(i);
	} 
	
	 for(int i = 0;i<m;i++){
	 	int ord,a,b;
	 	cin>>ord;
	 	list<int>::iterator iter;
	 	if(ord==1){
	 		cin>>a>>b;
	 		iter = find(li.begin(),li.end(),a);
	 		if(iter!=li.end()){//按题意说应该是一定能找到的
			 li.erase(iter); 
			 }
			iter = find(li.begin(),li.end(),b);
			if(iter!=li.end()){
			  li.insert(iter,a);//插左 
			 }
		 }
		 else if(ord==2){
		 	cin>>a>>b;
	 		iter = find(li.begin(),li.end(),a);
	 		if(iter!=li.end()){
			 li.erase(iter); 
			 }
			iter = find(li.begin(),li.end(),b);
			if(iter!=li.end()){
			  li.insert(++iter,a);//插右 
			 }
		 }
		 else if(ord==3){//交换采用的是找到后保存指针然后交换值 
		 	cin>>a>>b;
		 	int x,y; 
		 	list<int>::iterator it1;
		 	list<int>::iterator it2;
	 		iter = find(li.begin(),li.end(),a);
	 		if(iter!=li.end()){
			 it1 = iter;
			 x=*iter;//也可以不用保存值毕竟都保存指针了,到时候交换的时候用个temp也行 
			 }
			iter = find(li.begin(),li.end(),b);
			if(iter!=li.end()){
			 it2 = iter;
			 y=*iter;
			 }
			 *it1 = y;
			 *it2 = x;
		 }
		 else if(ord==4){//反转上没找到比较好的方法,貌似reserve()不能实现?没具体研究,使用就用了简单粗暴的遍历反转 
		 	list<int>l;
		 	for(iter = li.begin();iter!=li.end();iter++){
		 		l.push_front(*iter); 
			 }
			 li=l;
		 }
	 }
	  cout<<"Case"<<kl++<<":";
		 int k = 1;
		 long long sum = 0; 
		for(list<int>::iterator iter=li.begin();iter!=li.end();iter++,k++){
		int v= *iter;
		if(k%2==1)sum+=v;
	 }cout<<sum<<endl;
}
	return 0;
} 








猜你喜欢

转载自blog.csdn.net/qhlpptdyfn/article/details/79513706
今日推荐