我的思路:
先把状态以四位数简记,再开一个 长度9000的数组记录最少次数,和一个队列记录状态,不知道对不对,代码先贴着
程序代码:
先把状态以四位数简记,再开一个 长度9000的数组记录最少次数,和一个队列记录状态,不知道对不对,代码先贴着
程序代码:#include <stdio.h>
int front, rear;
int ss[9001] = {0}; //记录最少次数
int queue[9001] = {0};
int vol[] = {9, 7, 4, 2};
void InQueue(int n)
{ //入队列:当前状态为 n,将n下一步所有可能入队列
int k = 0, temp;
int i, j, a[4], tmp[12][4] = {0};
a[0] = n / 1000;
a[1] = n / 100 % 10;
a[2] = n / 10 % 10;
a[3] = n % 10;
for (i = 0;i < 12;++i)
{
tmp[i][0] = a[0];
tmp[i][1] = a[1];
tmp[i][2] = a[2];
tmp[i][3] = a[3];
}
for (i = 0;i < 4;++i)
for (j = 0;j < 4;++j)
{
if (i == j || !a[i] || a[j] == vol[j])
continue;
if (a[i] + a[j] > vol[j])
{
tmp[k][i] = a[i]+a[j]-vol[j];
tmp[k][j] = vol[j];
}
else
{
tmp[k][i] = 0;
tmp[k][j] = a[i] + a[j];
}
++k;
}
for (i = 0;i < k;++i)
{
temp = tmp[i][0]*1000+tmp[i][1]*100
+tmp[i][2]*10+tmp[i][3];
if (ss[temp] || temp == 9000)
continue;
queue[rear++] = temp;
ss[temp] = ss[n] + 1;
}
}
int OutQueue()
{ //出队列
return queue[front++];
}
void init()
{
int i;
InQueue(9000);
while (front != rear)
{
InQueue(OutQueue());
}
for (i = 0;i < 9000;++i)
{
if (!ss[i]) ss[i] = -1;
}
}
int main()
{
int a, b, c, d;
init();
while (scanf("%d,%d,%d,%d", &a, &b, &c, &d) == 4)
{
printf("%d\n", ss[a*1000+b*100+c*10+d]);
}
return 0;
}

[fly]存在即是合理[/fly]









,穷举虽然可能慢但是好理解,从fourleaves的帖子里找到的beyondyf大神和laoyang103大神他们用的方法一时半会还看不懂,还得慢慢琢磨。。