UVa101 - The Blocks Problem
2013-04-19 23:23
357 查看
桌上放有若干“blocks”
Figure: Initial Blocks World
初始位置如图所示;有五种操作:
(1)move a onto b :先将a和b之上的所有block都复位(恢复为initial状态),然后把a放在b上;
(2)move a over b :先将a之上的所有block都复位,然后把a放在b所在的堆顶端;
(3)pile a onto b :先将b之上的所有block都复位,然后把a以及a之上的所有block放在b之上;
(4)pile a over b :将a以及a之上所有的block放在b所在的堆顶端
(5)quit :退出
解题思路:
应该用链表来做,我用数组模拟了链表,因为觉得指针容易出错。
代码:
CT说用了cin,cout,又是c语言风格,乱七八糟的……苦口婆心劝说下,老老实实改成了scanf和printf,结果AC的时间减少了0.004~
初始位置如图所示;有五种操作:
(1)move a onto b :先将a和b之上的所有block都复位(恢复为initial状态),然后把a放在b上;
(2)move a over b :先将a之上的所有block都复位,然后把a放在b所在的堆顶端;
(3)pile a onto b :先将b之上的所有block都复位,然后把a以及a之上的所有block放在b之上;
(4)pile a over b :将a以及a之上所有的block放在b所在的堆顶端
(5)quit :退出
Sample Input 10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5 move 2 over 1 move 4 over 9 quit Sample Output 0: 0 1: 1 9 2 4 2: 3: 3 4: 5: 5 8 7 6 6: 7: 8: 9:
解题思路:
应该用链表来做,我用数组模拟了链表,因为觉得指针容易出错。
代码:
#include <string.h> #include <stdio.h> #define MAXNUM 25 typedef struct { int adress ; int start ; int pre ; int next ; } BlockType ; BlockType arr[MAXNUM]; void resetinit(int from) { int q ; int p = arr[from].next ; arr[from].next = -1 ; while(p != -1) { arr[p].adress = p ; arr[p].start = p ; arr[p].pre = -1 ; q = arr[p].next ; arr[p].next = -1 ; p = q ; } } int main() { int T ; scanf("%d" , &T) ; for(int i = 0 ; i < T ; i ++) { arr[i].start = i ; arr[i].adress = i ; arr[i].next = -1 ; arr[i].pre = -1 ; } char cmd1[10],cmd2[10]; int pmt1,pmt2; while(scanf("%s" , cmd1)) { if(! strcmp(cmd1,"quit")) break ; scanf("%d%s%d" , &pmt1 , cmd2 , &pmt2) ; int cmd ; if(! strcmp(cmd1,"move")) { if(! strcmp(cmd2,"onto")) cmd = 1 ; else cmd = 2 ; } else { if(! strcmp(cmd2,"onto")) cmd = 3 ; else cmd = 4 ; } int p,q ; switch(cmd) { case 1 : if(arr[pmt1].adress == arr[pmt2].adress) break ; resetinit(pmt1); resetinit(pmt2); if(arr[pmt1].pre != -1) { p = arr[pmt1].pre ; arr[p].next = -1 ; } else { p = arr[pmt1].adress ; arr[p].start = -1; } arr[pmt1].adress = arr[pmt2].adress ; arr[pmt1].pre = pmt2 ; arr[pmt2].next = pmt1 ; break ; case 2 : if (arr[pmt1].adress == arr[pmt2].adress) break ; resetinit(pmt1); if(arr[pmt1].pre != -1) { p = arr[pmt1].pre ; arr[p].next = -1 ; } else { p = arr[pmt1].adress ; arr[p].start = -1; } arr[pmt1].adress = arr[pmt2].adress ; p = pmt2 ; while(p != -1) { q = p ; p = arr[p].next ; } arr[q].next = pmt1 ; arr[pmt1].pre = q ; break; case 3 : if (arr[pmt1].adress == arr[pmt2].adress) break ; resetinit(pmt2); p = arr[pmt1].pre ; if(p != -1) { arr[p].next = -1 ; } else { q = arr[pmt1].adress ; arr[q].start = -1 ; } p = pmt1 ; while(p != -1) { arr[p].adress = arr[pmt2].adress ; p = arr[p].next ; } arr[pmt2].next = pmt1 ; arr[pmt1].pre = pmt2 ; break; case 4 : if (arr[pmt1].adress == arr[pmt2].adress) break ; p = arr[pmt1].pre ; if(p != -1) { arr[p].next = -1 ; } else { q = arr[pmt1].adress ; arr[q].start = -1 ; } p = pmt1 ; while(p != -1) { arr[p].adress = arr[pmt2].adress ; p = arr[p].next ; } p = pmt1 ; q = pmt2 ; while(arr[q].next != -1) { q = arr[q].next ; } arr[q].next = p ; arr[p].pre = q ; break; } } for(int i = 0 ; i < T ; i ++) { printf("%d:" , i) ; int tmp = arr[i].start ; while(tmp != -1) { printf(" %d" , tmp) ; tmp = arr[tmp].next ; } printf("\n") ; } return 0 ; }
CT说用了cin,cout,又是c语言风格,乱七八糟的……苦口婆心劝说下,老老实实改成了scanf和printf,结果AC的时间减少了0.004~
相关文章推荐
- UVA-101 The Blocks Problem
- uva 101 the blocks problem
- 例题5-2 UVa101 The Blocks Problem(STL:vector)
- 木块问题(The Blocks Problem, UVa 101)
- uva 101 The Blocks Problem(模拟栈)
- UVA - 101 The Blocks Problem
- uva101 The Blocks Problem
- uva 101 The Blocks Problem(模拟)
- UVa 101 - The Blocks Problem
- Uva 101 The blocks problem
- uva101 The Blocks Problem
- uva 101 - The Blocks Problem(模拟)
- Uva 101 - The Blocks Problem
- UVa 101: The Blocks Problem
- UVa 101 The Blocks Problem
- UVA 101 The Blocks Problem
- UVa 101 - The Blocks Problem(STL)
- UVa-101 The Blocks Problem
- UVA-101 The Blocks Problem
- Uva 101 - The Blocks Problem