我的思路:
先把状态以四位数简记,再开一个 长度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大神他们用的方法一时半会还看不懂,还得慢慢琢磨。。