UVA101- The Blocks Problem

题意:N个木块,有四种规则要你按照这些规则摆放木块,最后输出。

思路:首先要搞懂规则。1,move a onto b:将a,b上的木块放回原来的地方,然后将a放到b上面;2,move a over b:a上的木块放回原来位置,再将a放到b的最上面

3,pile a onto b:将b上的木块全部放回原来位置,将a以及a以上的木块整体移动到b上面;4,pile a over b:将a以及a以上的整体移动到b的最上面(b的木块不用动)

这道题就是单纯模拟,感觉模拟题会很烦人,一不小心就这写错,那写错。。。还是要很认真的!!!!网上看了很多别人的想法,自己综合了下。按自己的想法敲了一下代码。

#include<stdio.h>
#include<string.h>

struct stack{
	int b[30];
	int num; 
}block[30];

int postion[30];

void turn_back(int x) {
	int pos, t, T, cnt = 0;
	t = postion[x];
	for(int i = 1; i <= block[t].num; i++) 
		if (block[t].b[i] == x) {	
			pos = i;//记录所要目标木块x在其所在堆中的位置	
			break;
		}		
	for(int i = pos + 1; i <= block[t].num; i++)	{
		T = block[t].b[i];	
		block[T].num++;	
		cnt++;	
		for(int j = block[T].num; j >= 2; j++)
			block[T].b[j] = block[T].b[j - 1];//如果存在其他木块,要将其他木块上移一位
		block[T].b[1] = T;//将木块x放回原位置
		postion[T] = T;
	}
	block[t].num -= cnt;//将目标木块x原本所在的堆减去所还原的数量
}//木块放回原位函数

void move(int a, int b) {
	int t, T;
	t = postion[a];	
	T = postion[b];
	block[T].num++;
	block[t].num--;
	block[T].b[block[T].num] = a;	
	postion[a] = postion[b];
}

void pile(int a, int b) {
	int pos, t, T, cnt = 0;	
	t = postion[a];	
	T = postion[b];
	for(int i = 1; i <= block[t].num; i++) 
		if (block[t].b[i] == a) {
			pos = i;	
			break;	
		}	
	for(int i = pos; i <= block[t].num; i++) {
		block[T].b[++block[T].num] = block[t].b[i];//移动到b的上面
		cnt++;
		postion[block[t].b[i]] = T;
	}
	block[t].num -= cnt;//减掉移动的木块数量
}
 
int main() {
	int n, a, b;
	char str[10], s[10];
	while (scanf("%d", &n) != EOF) {
		for(int i = 0; i < n; i++) {
			block[i].b[1] = i;	
			block[i].num = 1;
			postion[i] = i;
		}
		while (scanf("%s", str)) {
			if (!strcmp(str, "quit"))	
				break;	
			scanf("%d %s %d", &a, s, &b);	
			if (a == b || a >= n || b >= n || postion[a] == postion[b])
				continue;
			if (!strcmp(str, "move") && !strcmp(s, "onto")) {
				turn_back(a);	
				turn_back(b);
				move(a, b);
			}			
			else if (!strcmp(str, "move") && !strcmp(s, "over")) {
				turn_back(a);
				move(a, b);	
			}
			else if (!strcmp(str, "pile") && !strcmp(s, "onto")) {
				turn_back(b);	
				pile(a, b);
			}
			else if (!strcmp(str, "pile") && !strcmp(s, "over"))
				pile(a, b);
		}	
		for(int i = 0; i < n; i++) {
			printf("%d:", i);	
			for(int j = 1; j <= block[i].num; j++)	
				printf(" %d", block[i].b[j]);
			printf("\n");
		}
	}
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值