这是一道模拟题,核心在于记录当前Block所在的位置信息,用一个二维数组记录下每块的情况。觉得这样的题就是要找到合适的数据结构存放数据,来模拟现实中的问题
先贴出如下代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct{
int s[30];
int size; //这是用来描述每个Block的大小
}box; //这个结构体用来存储每一个Block中存放数据的情况
box sss[30];
int pos[30]; //记录每个元素的位置信息
/*这个函数实现的功能是将一些Block初始化*/
int init(box *ss, int y)
{
int i=0, temp, x, c;
x = pos[y];
while(y != ss[x].s[i])
{
i++;
}
c = i;
i = i + 1;
for(; i<ss[x].size; ++i)
{
temp = ss[x].s[i];
ss[temp].size = 1;
ss[temp].s[0] = temp;
pos[temp] = temp;
}
ss[x].size = c+1;
return 0;
}
int main()
{
int a, b, c, i, j, k, gt, gt1;
int total;
char ch_1[7], ch_2[7];
scanf("%d", &total);
for(i=0; i<total; ++i)
{
sss[i].s[0] = i;
sss[i].size = 1;
pos[i] = i;
}
while(1)
{
scanf("%s", ch_1);
if(!strcmp(ch_1, "quit"))
break;
scanf("%d %s %d", &a, ch_2, &b);
if(pos[a] == pos[b]) continue;
if(strcmp(ch_1, "move")==0 && strcmp(ch_2, "onto")==0)
{
init(sss, a);
init(sss, b);
sss[pos[b]].size++;
sss[pos[b]].s[sss[pos[b]].size-1] = a;
sss[pos[a]].size--;
pos[a] = pos[b];
}
else if(strcmp(ch_1, "move")==0 && strcmp(ch_2, "over")==0)
{
init(sss, a);
sss[pos[b]].size++;
sss[pos[b]].s[sss[pos[b]].size-1] = a;
sss[pos[a]].size--;
pos[a] = pos[b];
}
else if(strcmp(ch_1, "pile")==0 && strcmp(ch_2, "onto")==0)
{
init(sss, b);
for(i=0; i<sss[pos[a]].size; ++i)
{
if(sss[pos[a]].s[i] == a)
break;
}
gt = i;
gt1 = pos[a];
for(; i<sss[gt1].size; ++i)
{
sss[pos[b]].size++;
sss[pos[b]].s[sss[pos[b]].size-1] = sss[gt1].s[i];
pos[sss[gt1].s[i]] = pos[b];
}
sss[gt1].size = gt;
}
else if(strcmp(ch_1, "pile")==0 && strcmp(ch_2, "over")==0)
{
for(i=0; i<sss[pos[a]].size; ++i)
{
if(sss[pos[a]].s[i] == a)
break;
}
gt = i;
gt1 = pos[a];
for(; i<sss[gt1].size; ++i)
{
sss[pos[b]].size++;
sss[pos[b]].s[sss[pos[b]].size-1] = sss[gt1].s[i];
pos[sss[gt1].s[i]] = pos[b];
}
sss[gt1].size = gt;
}
}
for(i=0; i<total; ++i)
{
printf("%d:", i);
for(j=0; j<sss[i].size; j++)
printf(" %d", sss[i].s[j]);
printf("\n");
}
/*system("pause"); */
return 0;
}
模拟题以后要理清思路之后再敲代码,否则将会陷入调试代码的泥潭。