zoj2954

题目大意:

模拟Hanoi塔的移动过程。移动的规则就不说了吧。看这道题的输入输出规则:
输入:第一行是case数。接下来每一行输入两个数字n,m,代表盘子的数量和移动的次数。
接下来的m行,每行两个数字a,b,表示把a上的顶端盘子移动到b上。
输出规则:
如果在第p步是个无效的移动,那么忽略他之后的移动,输出-p;
如果第p步之后完成了游戏,那么输出p
否则输出0

解题思路:

我们用代码模拟这个过程。s数组记录每个peg的情况。initial函数初始化,pop函数取出顶部盘子,push函数放入顶部盘子,Finish检查是否已经完成游戏,wrong变量记录是否已经出错

代码如下:

#include


int disk, move;


typedef struct stacknode{
int array[15];
int front;
} stack;


stack stt[4];
stack *s[4];


void initial(){
int i;
for(i=0;i<4;i++){
s[i]=&stt[i];
s[i]->front=0;
s[i]->array[0]=100;
}
for(i=1;i<=disk;i++)
s[1]->array[i]=disk-i+1;
s[1]->front=disk;
}


int pop(stack *st){
st->front--;
return st->array[st->front+1];
}


int f(stack *st){
return st->array[st->front];
}


void push(int i, stack *st){
st->front++;
st->array[st->front]=i;
return;
}


int Finish(){
int i;
int finish=1;
if(s[3]->front!=disk) finish=0;
for(i=1;i<=disk;i++)
if(s[3]->array[i]!=disk-i+1) finish=0;
return finish;
}


int main(){
int ncase;
int i;
scanf("%d",&ncase);
for(i=1;i<=ncase;i++){
int start, end;
int j, wrong=0, finish=0;
scanf("%d%d",&disk,&move);
initial();
for(j=1;j<=move;j++){
scanf("%d%d",&start,&end);
if((f(s[start])>f(s[end]))&&(wrong==0)&&(finish==0)) wrong=j;
push(pop(s[start]),s[end]);
if(Finish()&&(finish==0)&&(wrong==0)) finish=j;
}
if(wrong!=0) printf("-%d\n",wrong);
else if(finish!=0) printf("%d\n",finish);
else printf("0\n");
}
return 0;
}

你可能感兴趣的:(zoj)