ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1054. Ханойская башня

/*
    Prog: acm_1054
    results:
*/

#include <stdio.h>
#include <math.h>
int a = 1,b = 2,c = 4;
int disks[5];
int numbers[5][101];
int dest[5][101];
int destdisks[5];
int count;
int found;
int num;

int finish()
{
    int i,j;
    found = 1;

    for(i = 1;i<5;i++)
    {
        for(j = 0;j<=num;j++)
        {
            if(numbers[i][j]!=dest[i][j])
            {
                found = 0;
                break;
            }
        }
        if(!found)
            break;
    }

    if(found)return 1;
    if(disks[b]==num)
        return 1;
    return 0;
}
void move(int s,int n, int d)
{
    int k ;
    if(found||finish())return;
    if(n==1)
    {
        disks[d]++;
        numbers[d][disks[d]] = numbers[s][disks[s]];
        numbers[s][disks[s]] = 0;
        disks[s]--;

        count++;

    }else {
          k = 7^(s|d);

        move(s,n-1,k);

        move(s,1,d);
        move(k,n-1,d);
        finish();
    }
}

int main(int argc, char *argv[]) {
    int pos[100],i,j;
    int tmp[101];
    scanf("%d",&num);
    disks[a] = num;
    for(i = 0;i<num;i++)
        numbers[a][i+1] = num-i;

    for(i = 1;i<=num;i++)
    {
        scanf("%d",&pos[i]);
        pos[i]  =(int)pow(2,pos[i]-1);
        destdisks[pos[i]]++;
        dest[pos[i]][destdisks[pos[i]]] = i;
    }
    for(i = 1;i<5;i++)
    {
        for(j = 1;j<=destdisks[i];j++)
            tmp[destdisks[i]-j+1] = dest[i][j];
        for(j = 1;j<=destdisks[i];j++)
            dest[i][j] = tmp[j];
    }



    move(a,num,b);
    if(found)
        printf("%d",count);
    else printf("%d",-1);


    return 0;
}
// Cheers!