您的位置:首页 > 其它

POJ 1208 The Blocks Problem [模拟]

2012-04-04 14:43 288 查看
题意:

堆积木问题,四个移动条件要读对。

思路:

数据量小,直接模拟即可。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=30;
const int inf=(1<<30);
int n,m;
int a

;
void find(int now,int & ii,int &jj)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n&&a[i][j]!=-1;j++)
{
if(a[i][j]==now)
{
ii=i;
jj=j;
return ;
}
}
}
}
void clear(int i,int j)
{
while(a[i][j]!=-1)
{
int tmp=a[i][j];
a[tmp][0]=tmp;
a[i][j]=-1;
j++;
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
a[i][j]=-1;
a[i][0]=i;
}
char str[10];
int u,v;
while(scanf("%s",str),str[0]!='q')
{
scanf("%d",&u);
if(str[0]=='m')
{
scanf("%s",str);
scanf("%d",&v);
int ui,uj,vi,vj;
find(u,ui,uj);
find(v,vi,vj);
if(ui==vi)
continue;
if(str[1]=='n')
{
clear(vi,vj+1);
a[vi][vj+1]=u;
clear(ui,uj);
}
else
{
while(a[vi][vj]!=-1)
{
vj++;
}
a[vi][vj]=u;
clear(ui,uj);
}
}
else
{
scanf("%s",str);
scanf("%d",&v);
int ui,uj,vi,vj;
find(u,ui,uj);
find(v,vi,vj);
if(ui==vi)
continue;
if(str[1]=='n')
{
vj++;
clear(vi,vj);
while(a[ui][uj]>=0)
{
a[vi][vj]=a[ui][uj];
a[ui][uj]=-1;
uj++;
vj++;
}

}
else
{
while(a[vi][vj]!=-1)
{
vj++;
}
while(a[ui][uj]!=-1)
{
a[vi][vj]=a[ui][uj];
a[ui][uj]=-1;
vj++;
uj++;
}
}
}
}
for(int i=0;i<n;i++)
{
printf("%d:",i);
int j=0;
while(a[i][j]!=-1)
{
printf(" %d",a[i][j]);
j++;
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: