问题描述
问题是解析一系列命令,这些命令指示机械臂如何操作平桌上的积木。最初,表上有 n 个块(从 0 到 n-1 编号),其中块 bi 与块 bi+1 相邻,对于所有 0 ≤ i
用于操作块的机械臂的有效命令是:
• 将 a 移到 b
其中 a 和 b 是块编号,在将堆叠在块 a 和 b 顶部的任何块返回到其初始位置后,将块 a 放到块 b 上。
• 将 a 移到 b 上
将块 a 放到包含块 b 的堆栈顶部,然后将所有堆叠在块 a 顶部的块返回到它们的初始位置。
• 将 a 堆在 b 上
将由块 a 和堆叠在块 a 上方的任何块组成的一堆块移动到块 b 上。在桩发生之前,块 b 顶部的所有块都被移动到它们的初始位置。堆叠在 a 块上方的块在移动时保持其顺序。
• 将 a 堆在 b 上
将包含块 a 的一堆块以及堆叠在块 a 上方的任何块放到包含块 b 的堆栈的顶部。堆叠在 a 块上方的块在移动时保持其原始顺序。
• 退出
终止块世界中的操作。任何 a = b 或 a 和 b 在同一块堆栈中的命令都是非法命令。所有非法命令都应该被忽略,并且应该对块的配置没有影响。
输入:
输出:
我的代码:
#include<stdio.h>
#include<string.h>
void back(int arr[]) {
}
int main() {
int noi = 0;
printf("please input n:");
int n;
scanf(" %d",& n);
int arr[n][n];
//this for storing their position
int i,j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
arr[i][j] = -1;
}
arr[i][0] = i;
}
//empty as -1
char str1[5],str2[5],cmd[20]; //cmd is the complete line which will be spilt
int s,d; //source & destination
char st[2],dt[2]; //char variable of int s and d
char * tk; //a pointer for strtok
int quit = 0;
while (1) {
s = -1;
d = -1;
while (!(s >= 0 && s < n && d >= 0 && d < n)) {
fflush(stdin);
fgets(cmd,sizeof(cmd),stdin);
tk = strtok(cmd," ");
if (strcmp(tk,"quit") == 0) {
quit = 1;
break;
} else {
strcpy(str1,tk);
tk = strtok(NULL," ");
strcpy(st,tk);
s = atoi(st);
tk = strtok(NULL," ");
strcpy(str2," ");
strcpy(dt,tk);
d = atoi(dt);
}
}
if (quit == 1) {
break;
}
//finally doing the commands
if (strcmp(str1,"move") == 0) {
if (strcmp(str2,"onto") == 0) {
//empty s
for (i = 0; i < n && arr[s][i] != -1; i++) {
arr[arr[s][i]][0] = arr[s][i];
arr[s][i] = -1;
}
//empty d
for (i = 0; i < n && arr[d][i] != -1; i++) {
arr[arr[d][i]][0] = arr[d][i];
arr[d][i] = -1;
}
//Now move s to d
i = 1;
arr[d][i] = arr[s][0];
arr[s][0] = -1;
} else if (strcmp(str2,"over") == 0) {
//empty s
for (i = 0; i < n && arr[s][i] != -1; i++) {
arr[arr[s][i]][0] = arr[s][i];
arr[s][i] = -1;
}
//move s to d
i = 1;
while (arr[d][i] != -1) {
i++;
}
arr[d][i] = arr[s][0];
arr[s][0] = -1;
}
} else if (strcmp(str1,"pile") == 0) {
if (strcmp(str2,"onto")) {
//empty d
for (i = 0; i < n && arr[d][i] != -1; i++) {
arr[arr[d][i]][0] = arr[d][i];
arr[d][i] = -1;
}
//pile s to d
//find empty of d
i = 1;
while (arr[d][i] != -1) {
i++;
}
//find end(empty) of s and store in j
j = 0;
while (arr[s][j] != -1) {
j++;
}
//piling
int tj = 0; //for iterating in s
while (j - 1 >= 0) {
arr[d][i] = arr[s][tj];
arr[s][tj] = -1;
j--;
tj++;
i++;
}
} else if (strcmp(str2,"over")) {
//pile s to d
//find empty of d
i = 1;
while (arr[d][i] != -1) {
i++;
}
//find end(empty) of s and store in j
j = 0;
while (arr[s][j] != -1) {
j++;
}
//piling
int tj = 0; //for iterating in s
while (j - 1 >= 0) {
arr[d][i] = arr[s][tj];
arr[s][tj] = -1;
j--;
tj++;
i++;
}
}
}
}
//print results
for (i = 0; i < n; i++) {
printf("%d:",i);
for (j = 0; j < n && arr[i][j] != -1; j++) {
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)