ZOJ-2416

大爷的,memset方法变量位置填错了,一真Segmentation Fault,memset(flag, 0, 10000 * sizeof(int)) 我写成了memset(flag, 10000 * sizeof(int), 0),这样output竟然是对的??不可思议,一提交就错,坑死。。好吧说正题,这题简单的BFS,但对我这种菜鸟来说就不简单了。。调了一晚上,先是想用JAVA写,不知道是算法错还是怎么回事,各种超时。。后来发现其实C里面用数组代替队列也挺简单的,就用C了。。开始时竟然没有把已搜索过值加标记,队列直接就爆了。。写之前应该复习下BFS的。。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void get_digits(int number, int d[4])
{
    int i;
    for (i = 0; i < 4; i++)
    {
        d[3 - i] = number % 10;
        number /= 10;
    }
}

void get_childs(int number, int r[11])
{
    int i, j, d[4];
    get_digits(number, d);
    for (i = 0; i < 8; i++)
    {
        int index = i / 2;
        int digit = d[index];
        int res = 0;
        if (i % 2)
            digit = digit + 1 == 10 ? 1 : digit + 1;
        else
            digit = digit - 1 == 0 ? 9 : digit - 1;
        for (j = 0; j < 4; j++)
            res = res * 10 + (j == index ? digit : d[j]);
        r[i] = res;
    }
    r[8] = d[1] * 1000 + d[0] * 100 + d[2] * 10 + d[3];
    r[9] = d[0] * 1000 + d[2] * 100 + d[1] * 10 + d[3];
    r[10] = d[0] * 1000 + d[1] * 100 + d[3] * 10 + d[2];
}

int main()
{
    int *flag = malloc(10000 * sizeof(int));
    int *queue = malloc(10000 * sizeof(int));
    int i, t, src, dst, r[11];
    scanf("%d", &t);
    while (t--)
    {
        memset(flag, 0, 10000 * sizeof(int));
        scanf("%d", &src);
        scanf("%d", &dst);
        if (src == dst)
        {
            printf("%d\n", 0);
            continue;
        }

        int step = 0, begin = 0, end = 1, find = 0;
        queue[begin] = src;
        flag[src] = 1;
        while (!find)
        {
            int pop = queue[begin++];
            int number = pop % 10000;
            step = pop / 10000;
            get_childs(number, r);
            for (i = 0; i < 11; i++)
            {
                if (dst == r[i])
                {
                    printf("%d\n", step + 1);
                    find = 1;
                    break;
                }
                else if (flag[r[i]] == 0)
                {
                    queue[end++] = r[i] + (step + 1) * 10000;
                    flag[r[i]] = 1;
                }
            }
        }
    }
    free(queue);
    free(flag);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值