101 - The Blocks Problem

来源:互联网 发布:mac 触摸板 鼠标方向 编辑:程序博客网 时间:2024/04/30 11:30

题目:101 - The Blocks Problem


题目大意:就是给出一排积木,根据一下的操作堆出要求的积木。

move a onto b的意思是:把a和b上的积木归位后,再将a放在b上。

move a over b的意思是:把a上的积木归位,再把a放在b的最上方。

pile a onto b的意思是:把b上的积木归位,再将a和a上的积木作为一个整体一并移到b上。

pile a over b的意思是:将a和a上的积木作为一个整体一并移到b的最上方。

用一个二维数组来模拟积木的排放位置,用一个map来记录积木的所在堆。注意:把积木归位是把数组里的元素放在原来的位置。

还有这里可以分为三个动作:把元素归位, 把元素移动,和修改映射。把这些基本动作组合就可以实现所有的操作了。所以最好写基本动作,不然容易出错。


#include<stdio.h>#include<string.h>const int N = 27;int n, s[N][N], map[N];char s1[N];void move_onto(int a, int b) {int l1 = map[a];int l2 = map[b];int i, j;for( i = 0; s[l1][i] != a ; i++);s[l1][i] = -1;i++;while(s[l1][i] != -1) {s[s[l1][i]][0] = s[l1][i];map[s[l1][i]] = s[l1][i];s[l1][i] = -1;i++;}for( i = 0; s[l2][i] != b ; i++);i++;j = i;while(s[l2][i] != -1) {s[s[l2][i]][0] = s[l2][i];map[s[l2][i]] = s[l2][i];s[l2][i] = -1;i++;}s[l2][j] = a;map[a] = map[b];}void move_over(int a, int b) {int l1 = map[a];int l2 = map[b];int i;for( i = 0; s[l1][i] != a ; i++);s[l1][i] = -1;i++;while(s[l1][i] != -1) {s[s[l1][i]][0] = s[l1][i];map[s[l1][i]] = s[l1][i];s[l1][i] = -1;i++;}for( i = 0; s[l2][i] != b ; i++);while(s[l2][i] != -1){i++;}s[l2][i] = a;map[a] = map[b];}void pile_over(int a, int b) {int l1 = map[a];int l2 = map[b];int i, j;for( i = 0; s[l2][i] != b ; i++);while(s[l2][i] != -1) {i++;}for(j = 0; s[l1][j] != a; j++);while(s[l1][j] != -1) {s[l2][i++] = s[l1][j];map[s[l1][j]] = l2;s[l1][j++] = -1;}}void pile_onto(int a, int b) {int l1 = map[a];int l2 = map[b];int i, j;for( i = 0; s[l2][i] != b ; i++);i++;j = i;while(s[l2][i] != -1) {s[s[l2][i]][0] = s[l2][i];map[s[l2][i]] = s[l2][i];s[l2][i] = -1;i++;}for(i = 0; s[l1][i] != a; i++);while(s[l1][i] != -1) {s[l2][j++] = s[l1][i];map[s[l1][i]] = l2;s[l1][i++] = -1;}}void prrintf() {for(int i = 0; i < n; i++) {printf("%d:", i);if(s[i][0] != -1) {for(int j = 0; s[i][j] != -1; j++) {printf(" %d", s[i][j]);}}printf("\n");}}int main() {scanf("%d", &n);memset(s, -1, sizeof(s));memset(map, 0, sizeof(map));int i, n1, n2;for(i = 0; i < n; i++)s[i][0] = i;for(i = 0; i < n; i++)map[i] = i;while(scanf("%s", &s1)) {if(strcmp(s1, "move") == 0) {scanf("%d%s%d", &n1, &s1, &n2);if(map[n1] == map[n2])continue;if(strcmp(s1, "onto") == 0) {move_onto(n1, n2);}else if(strcmp(s1,"over") == 0) {move_over(n1, n2);}}else if(strcmp(s1, "pile") == 0) {scanf("%d%s%d", &n1, &s1, &n2);if(map[n1] == map[n2])continue;if(strcmp(s1, "onto") == 0) {pile_onto(n1, n2);}else if(strcmp(s1,"over") == 0) {pile_over(n1, n2);}}else if(strcmp(s1, "quit") == 0)break;}prrintf();return 0;}


0 0