标签:break ring ini ios for 数组 保存 freopen stream
move a onto b 将a和b上的所有的积木放回原始位置,然后将a放到b上面
move a over b 将a放在包含b的栈顶,将a上所有的积木放回原处
pile a onto b 先将b上的积木放回原处,将a和a上面的积木放在b的上面,
pile a over b 将a和a上面的积木放在包含b的堆上
//数组保存列表头
#include <iostream>
#include<stdio.h>
using namespace std;
struct Node
{
int i;
int oi;
struct Node* next;
struct Node* pre;
};
Node* findNode(Node* node,const int a);
Node* findLastNode(Node* aNode);
void backAllNextNode(Node* node, Node* aNode);
void updateNextNodeHead(Node* const node,Node* aNode);
void init(const int n,Node* const node)
{
for(int i = 0; i < n; i++)
{
struct Node n;
n.i = i;
n.oi = i;
n.next = NULL;
n.pre = NULL;
*(node+i) = n;
}
}
void printList(Node * node)
{
while(node!=NULL)
{
cout<<" "<<node->oi;
node = node->next;
}
}
void print(Node* const node,const int n)
{
for(int i = 0; i < n; i++)
{
cout<<i<<":";
if(node[i].i == i)
{
//是一个列表
printList(node+i);
}
cout<<endl;
}
}
void moveOnto(Node* const node,int const a,int const b)
{
if(node[a].i == node[b].i)
{
return;
}
Node* aNode = findNode(node,a);
Node* bNode = findNode(node,b);
if(aNode->pre!=NULL)
{
aNode->pre->next = NULL;
aNode->pre = NULL;
}
backAllNextNode(node,aNode);
backAllNextNode(node,bNode);
//a放在b后
bNode->next = aNode;
aNode->pre = bNode;
aNode->i = node[b].i;
}
void moveOver(Node* const node,const int a,const int b)
{
if(node[a].i == node[b].i)
{
return;
}
Node* aNode = findNode(node,a);
if(aNode->pre != NULL)
{
aNode->pre->next = NULL;
aNode->pre = NULL;
}
backAllNextNode(node,aNode);
Node* bHeadNode = node+b;
node[a].i = bHeadNode->i;
Node* lastNode = findLastNode(bHeadNode);
lastNode->next = aNode;
aNode->pre = lastNode;
}
void pileOnto(Node* const node,const int a,const int b)
{
if(node[a].i == node[b].i)
{
return;
}
Node* bNode = findNode(node,b);
backAllNextNode(node,bNode);
Node* aNode = findNode(node,a);
if(aNode->pre!=NULL)
{
aNode->pre->next = NULL;
aNode->pre = NULL;
}
//将a后面的列放在b的后面
node[a].i = node[b].i;
aNode->pre = bNode;
bNode->next = aNode;
//需要将a后面节点的头更新成b的节点头
updateNextNodeHead(node,aNode);
}
void pileOver(Node* const node,const int a,const int b)
{
if(node[a].i == node[b].i)
{
return;
}
Node* aNode = findNode(node,a);
Node* lastNode = findLastNode(node+b);
if(aNode->pre!=NULL)
{
aNode->pre->next = NULL;
aNode->pre = NULL;
}
node[a].i = node[b].i;
aNode->pre = lastNode;
lastNode->next = aNode;
updateNextNodeHead(node,aNode);
}
int main()
{
//freopen("d:\\1.txt","r",stdin);
int n;
while(cin>>n)
{
Node* node = new Node[n+1];
init(n,node);
int a,b;
string op,w;
while(cin)
{
cin>>op;
if(op=="quit")
{
break;
}
cin>>a>>w>>b;
if(op=="move")
{
if(w=="onto")
{
moveOnto(node,a,b);
}
else if(w=="over")
{
moveOver(node,a,b);
}
}
else if(op=="pile")
{
if(w=="onto")
{
pileOnto(node,a,b);
}
else if(w=="over")
{
pileOver(node,a,b);
}
}
}
print(node,n);
}
return 0;
}
Node* findNode(Node* node,const int a)
{
return node+a;
}
Node* findLastNode(Node* aNode)
{
Node* sNode = aNode;
while(sNode->next!=NULL)
{
sNode=sNode->next;
}
return sNode;
}
/**
*将aNode后面的节点返回原处,并断开联系
*/
void backAllNextNode(Node* node, Node* aNode)
{
Node* nextNode;
while(aNode->next!=NULL)
{
nextNode = aNode->next;
aNode->next = NULL;
nextNode->pre = NULL;
aNode = nextNode;
node[nextNode->oi].i = nextNode->oi;
}
}
void updateNextNodeHead(Node* const node,Node* aNode)
{
Node* newHead = aNode;
while(aNode->next!=NULL)
{
aNode->next->i = newHead->i;
aNode = aNode->next;
}
}
标签:break ring ini ios for 数组 保存 freopen stream
原文地址:http://www.cnblogs.com/shuiyonglewodezzzzz/p/6683519.html