UVA - 101

xiaoxiao2021-02-28  65

题解: #include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; void initi(int place[], int blocks[][30], int top[], int x) { while(blocks[place[x]][top[place[x]]] != x) { int now = blocks[place[x]][top[place[x]]--]; place[now] = now; blocks[now][++top[now]] = now; } } void move_over(int place[], int blocks[][30], int top[], int a, int b) { initi(place, blocks, top, a); --top[place[a]]; blocks[place[b]][++top[place[b]]] = a; place[a] = place[b]; } void move_onto(int place[], int blocks[][30], int top[], int a, int b) { initi(place, blocks, top, a); initi(place, blocks, top, b); --top[place[a]]; blocks[place[b]][++top[place[b]]] = a; place[a] = place[b]; } void pile_over(int place[], int blocks[][30], int top[], int a, int b) { int f[30], i = 0; while(blocks[place[a]][top[place[a]]] != a) { place[blocks[place[a]][top[place[a]]]] = place[b]; f[i++] = blocks[place[a]][top[place[a]]--]; } top[place[a]]--; place[a] = place[b]; f[i] = a; for(int j = i; j >= 0; --j) { blocks[place[b]][++top[place[b]]] = f[j]; } } void pile_onto(int place[], int blocks[][30], int top[], int a, int b) { initi(place, blocks, top, b); int f[30], i = 0; while(blocks[place[a]][top[place[a]]] != a) { place[blocks[place[a]][top[place[a]]]] = place[b]; f[i++] = blocks[place[a]][top[place[a]]--]; } top[place[a]]--; place[a] = place[b]; f[i] = a; for(int j = i; j >= 0; --j) { blocks[place[b]][++top[place[b]]] = f[j]; } } int main() { int num, block[30][30] = {0},place[30] = {0},top[30] = {0}; scanf("%d",&num); for(int i = 0; i < num; ++i) { block[i][0] = i; place[i] = i; top[i] = 0; } char title[10] = {'0'}, end[10]= {'0'}; while(1) { int a, b; scanf("%s",title); if(title[0] == 'q')break; scanf("%d",&a); scanf("%s",end); scanf("%d",&b); if(place[a] != place[b]) { if(title[0] == 'm') { if(end[1] == 'n') { move_onto(place,block,top,a,b); } else if(end[1] == 'v') { move_over(place,block,top,a,b); } } else if(title[0] == 'p') { if(end[1] == 'n') { pile_onto(place,block,top,a,b); } else if(end[1] == 'v') { pile_over(place,block,top,a,b); } } } } for ( int i = 0 ; i < num ; ++i ) { int now = 0; printf("%d:",i); while ( now <= top[i] ) printf(" %d",block[i][now++]); printf("\n"); } }
转载请注明原文地址: https://www.6miu.com/read-47402.html

最新回复(0)