您的位置:首页 > 其它

移动小球问题

2014-08-09 22:27 190 查看
数组做法

#include<iostream>
using namespace std;
int A[100];
int find(int);
void shift_circular_left(int ,int);
void shift_circular_right(int ,int);
int main()
{
int n,m;
char type;
int x,y,p,q;
cin>>n>>m;
for(int i=1;i<=n;i++)
A[i]=i;
for(int i=0;i<m;i++)
{
cin>>type>>x>>y;
p=find(x);
q=find(y);
if(type=='A')
{
if(q>p) shift_circular_left(p,q-1);
else shift_circular_right(q,p);
}
else
{
if(q>p) shift_circular_left(p,q);
else shift_circular_right(q+1,p);
}
}
for(int i=1;i<=n;i++)
cout<<A[i]<<" ";
cout<<endl;
return 0;
}

int find(int s)
{
int i;
for( i=1;;i++)
if(s==A[i]) return i;
}

void shift_circular_left(int s,int t)
{
int temp;
temp=A[s];
for(int i=s+1;i<=t;i++)
A[i-1]=A[i];
A[t]=temp;
}

void shift_circular_right(int s,int t)
{
int temp;
temp=A[t];
for(int i=t-1;i>=s;i--)
A[i+1]=A[i];
A[s]=temp;
}


链式结构做法

#include<iostream>
using namespace std;
int left_[100];
int right_[100];
void link(int,int);
int main()
{
int n,m;
char type;
int x,y;
cin>>n>>m;
for(int i=1;i<=n;i++)
left_[i]=i-1,right_[i]=i+1;
right_[0]=1,left_[n+1]=n;
for(int i=0;i<m;i++)
{
cin>>type>>x>>y;
link(left_[x],right_[x]);
if(type=='A')
{
link(left_[y],x);
link(x,y);
}
else
{
link(x,right_[y]);
link(y,x);
}
}
for(int i=0,start=0;i<n;i++)
{
cout<<right_[start]<<" ";
start=right_[start];
}
cout<<endl;
return 0;
}

void link(int s,int t)
{
right_[s]=t;
left_[t]=s;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: