我的思路:
先把状态以四位数简记,再开一个 长度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]