UVA 101 The Blocks Problem
2016-07-22 10:08
489 查看
UVA 101 The Blocks Problem
题目大意:move a onto b:找到a和b所在列,把a和b数字以上的数字全部放回原位置,然后把a放到b所在的列头
move a over b:找到a所在列,把a数字以上的数字全部放回原位置,然后把a放到b所在的列头
pile a onto b:把b所在列b数字以上的数字全部放回原位置,然后把a和a以上的数字全放到b所在列列头
pile a over b:把a和a以上的数字全放到b所在列列头
解题思路:用栈的思想构造数组来解决
#include <stdio.h> #include <iostream> using namespace std; int s[100][100], oa[100]; // 栈 int num[100], ob; int top[100]; //头指针 void move(int a, int x) { for(; s[x][top[x]-1] != a; top[x]--) { int t = s[x][top[x]-1]; s[t][top[t]] = t; num[t] = t; top[t]++; } } void pile(int a, int x) { for(; s[x][top[x]-1] != a; top[x]--) { oa[ob] = s[x][top[x]-1]; ob++; } } void over(int b, int y) { for(; ob >= 0; ob--) { s[y][top[y]] = oa[ob]; top[y]++; num[oa[ob]] = y; } } int main() { int n; while(scanf("%d", &n) != EOF) { getchar(); for(int i = 0; i < n; i++) { s[i][0] = i; num[i] = i; top[i] = 1; } char com1[100], com2[100]; int a, b; while(scanf("%s", com1) && com1[0] != 'q') { scanf("%d%s%d", &a, com2, &b); int x = num[a], y = num[b]; if(x == y) continue; if(com1[0] == 'm') { ob = 0; move(a, x); oa[ob] = a; top[x]--; } else if(com1[0] == 'p') { ob = 0; pile(a, x); oa[ob] = a; top[x]--; } if(com2[1] == 'n') { move(b, y); over(b, y); } else if(com2[1] == 'v') over(b, y); } for(int i = 0; i < n; i++) { printf("%d:", i); for(int j = 0; j < top[i]; j++) { printf(" %d", s[i][j]); } printf("\n"); } } return 0; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C 语言简单加减乘除运算
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方
- C语言二进制思想以及数据的存储
- C语言中计算正弦的相关函数总结