hdu 2184 汉诺塔m步后的状态

来源:互联网 发布:ubuntu 16.04 selinux 编辑:程序博客网 时间:2024/06/05 08:43

汉诺塔m(64bit)步后的状态



#include <stdio.h>#include <string.h>#define N 65__int64 bit[N] = {1};void cal_bit(){    for(int i = 1; i < 64; ++i)        bit[i] = bit[i-1] << 1;}void dfs(int *a,int *b,int *c,int n,__int64 m){    if(!n)        return;    if(m > bit[n-1])///第n块可以移到目标位置,移动剩下的n-1块    {        c[++c[0]] = n;        dfs(b,a,c,n-1,m-bit[n-1]);    }    else if(m == bit[n-1])///恰好将第n块移到目标位置    {        c[++c[0]] = n;        for(int i = 1; i < n; ++i)            b[++b[0]] = n - i;    }    else///第n块保留在原位置    {        a[++a[0]] = n;        dfs(a,c,b,n-1,m);    }}int main(){    cal_bit();    __int64 m;    int n,t,a[N],b[N],c[N];    scanf("%d",&t);    while(t--)    {        int i;        scanf("%d%I64d",&n,&m);        a[0] = b[0] = c[0] = 0;              dfs(a,b,c,n,m);        printf("%d",a[0]);        for(i = 1; i <= a[0]; ++i)            printf(" %d",a[i]);        printf("\n");        printf("%d",b[0]);        for(i = 1; i <= b[0]; ++i)            printf(" %d",b[i]);        printf("\n");        printf("%d",c[0]);        for(i = 1; i <= c[0]; ++i)            printf(" %d",c[i]);        printf("\n");    }    return 0;}


原创粉丝点击