大爷的,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;
}