当前位置: 首页 > news >正文

平分汽油问题

一只大桶里盛着12升汽油,要求把它们分成两份,每份6升,可是旁边没有量器, 只有一只能装9升和一只能装5升的空桶,请你利用这3只桶倒来倒去,把汽油平分开来。

#include <stdio.h> #include <stdbool.h> #include <string.h> #define MAX_STEPS 20 const int Capcity[3] = {12, 9, 5}; const char *Bucket_name[3] = {"12升桶", "9升桶", "5升桶"}; bool visited[13][10][6]; typedef struct { int state[3]; // 三个桶的油量 char action[100]; // 操作描述 } Step; Step steps[MAX_STEPS]; int step_count = 0; // 目标状态:12升桶=6, 9升桶=6, 5升桶=0 bool Is_target(int s[3]) { return (s[0] == 6 && s[1] == 6 && s[2] == 0); } // 复制状态 void Copy_state(int dst[3], int src[3]) { int i; for(i=0;i<3;i++) dst[i] = src[i]; } // 执行倒油操作:从桶A倒到桶B,成功返回1 bool Pour_oil(int curr[3], int A, int B, int next[3]) { int space; int amount; // 源桶必须非空,目标桶必须未满 if (curr[A] == 0 || curr[B] == Capcity[B]) { return 0; } Copy_state(next, curr); // 计算倒油量 space = Capcity[B] - curr[B]; // 目标桶剩余空间 amount = curr[A] < space ? curr[A] : space; // 取较小值 next[A] -= amount; next[B] += amount; return 1; } // 深度优先搜索 + 迭代加深 bool dfs(int curr[3], int depth, int max_depth) { int i, j; int next[3]; int amount; // 找到目标 if (Is_target(curr)) { step_count = depth; return 1; } // 超过深度限制 if (depth >= max_depth) return 0; // 标记已访问 visited[curr[0]][curr[1]][curr[2]] = true; // 尝试6种倒油方式 (0->1, 0->2, 1->0, 1->2, 2->0, 2->1) for (i = 0; i < 3; i++) { for ( j = 0; j < 3; j++) { if (i == j) continue; if (Pour_oil(curr, i, j, next)) { // 跳过已访问状态 if (visited[next[0]][next[1]][next[2]]) continue; // 记录当前步骤 Copy_state(steps[depth].state, next); amount = curr[i] - next[i]; sprintf(steps[depth].action, "从%s倒%d升到%s", Bucket_name[i], amount, Bucket_name[j]); // 递归搜索 if(dfs(next, depth + 1, max_depth)) return 1; } } } // 回溯:取消访问标记 visited[curr[0]][curr[1]][curr[2]] = 0; return 0; } // 打印解决方案 void Print_solution() { int i; printf("初始状态: 12升桶装12升, 9升桶装0升, 5升桶装0升\n\n"); printf("目标状态: 12升桶装6升, 9升桶装6升,5升桶装0升\n\n"); for ( i = 0; i < step_count; i++) { printf("步骤 %d: %s\n", i + 1, steps[i].action); printf(" [12升=%d, 9升=%d, 5升=%d]\n", steps[i].state[0], steps[i].state[1], steps[i].state[2]); } } int main() { int start[3] = {12, 0, 0}; // 初始状态 int max_d; bool found = 0; // 迭代加深,找到步数最少的解 for (max_d = 1; max_d <= MAX_STEPS && !found; max_d++) { memset(visited, 0, sizeof(visited)); if (dfs(start, 0, max_d)) { found = 1; printf("找到最优解,共 %d 步操作!\n", step_count); } } if (found) Print_solution(); else printf("未找到解决方案!\n"); return 0; }


找到最优解,共 8 步操作!

初始状态: 12升桶装12升, 9升桶装0升, 5升桶装0升

目标状态: 12升桶装6升, 9升桶装6升,5升桶装0升

步骤 1: 从12升桶倒5升到5升桶
12升=7, 9升=0, 5升=5
步骤 2: 从5升桶倒5升到9升桶
12升=7, 9升=5, 5升=0
步骤 3: 从12升桶倒5升到5升桶
12升=2, 9升=5, 5升=5
步骤 4: 从5升桶倒4升到9升桶
12升=2, 9升=9, 5升=1
步骤 5: 从9升桶倒9升到12升桶
12升=11, 9升=0, 5升=1
步骤 6: 从5升桶倒1升到9升桶
12升=11, 9升=1, 5升=0
步骤 7: 从12升桶倒5升到5升桶
12升=6, 9升=1, 5升=5
步骤 8: 从5升桶倒5升到9升桶
12升=6, 9升=6, 5升=0

http://www.jsqmd.com/news/378642/

相关文章:

  • 山东昊丰密封件有限公司:合作前需知悉的通用建议 - 品牌推荐
  • 一篇搞定全流程AI论文写作软件 千笔·专业论文写作工具 VS 知文AI
  • 2026年热门的麦饭石不粘锅/高档不粘锅公司口碑推荐哪家靠谱 - 品牌宣传支持者
  • 2026年知名的半圆管加工/后壁半圆管直销厂家推荐选哪家(更新) - 品牌宣传支持者
  • 2026年知名的格栅机尼龙耙齿/尼龙耙齿格栅机源头直供参考哪家便宜 - 品牌宣传支持者
  • 效率直接起飞 9个降AIGC平台测评:MBA高效降AI率全攻略
  • 山东昊丰密封件有限公司:供应商信息查询与建议 - 品牌推荐
  • 访客云(FonkaLink):了解访客管理平台核心功能 - 品牌推荐
  • 山东昊丰密封件有限:产品咨询与使用指南 - 品牌推荐
  • 运动医学耗材如何选?这些优质批发商值得关注,泌尿科刨削动力代加工/妇科刨削动力代加工,运动医学企业推荐排行榜 - 品牌推荐师
  • 2026年口碑好的无极绳绞车梭车/无极绳绞车压绳轮组如何选生产商推荐(精选) - 品牌宣传支持者
  • 2026年质量好的聚酯切片吨袋/危化品吨袋工厂采购指南如何选(实用) - 品牌宣传支持者
  • 2026年口碑好的船舶高压直流继电器/电解电镀高压直流继电器直销厂家价格参考怎么选 - 品牌宣传支持者
  • 2026年班车租赁企业口碑排行,轻松找靠谱租赁,代驾租车/中巴租车/汽车租赁/企业租车/商务车租赁,租赁企业口碑推荐 - 品牌推荐师
  • 山东昊丰密封件有限公司:了解企业背景与沟通方式 - 品牌推荐
  • 2026年性价比高的医疗器械纯化水设备源头厂家推荐 - 工业推荐榜
  • 踩过N个坑后总结|5款靠谱AI论文生成工具,免费无套路,新手也能会
  • 访客云联系方式:智能化访客管理平台使用指南 - 品牌推荐
  • 以为是智商税?这款 AI 论文工具,生成 + 降重 + 参考文献一站式搞定
  • 2026年评价高的高速线切割机床/数控线切割机床哪家强生产厂家实力参考 - 品牌宣传支持者
  • STP--生成树协议
  • 2026年广州靠谱的小篆打印设备公司推荐与选购指南 - myqiye
  • 访客云:安全与部署模式的中性分析 - 品牌推荐
  • 2026年质量好的厚门小角度铰链/厚薄门小角度铰链生产商实力参考哪家质量好(更新) - 品牌宣传支持者
  • VLAN---交换机中使用的技术
  • 靠谱的嘉陈校具具有什么优势,湖南地区食堂桌椅定制 - 工业品牌热点
  • 访客云联系方式:政企园区访客系统操作建议 - 品牌推荐
  • 2026年评价高的EPE珍珠棉发泡机/珍珠棉发泡机如何选生产商推荐(精选) - 品牌宣传支持者
  • 2026年南京比较不错的棱透复合镜品牌产品排名,看看有哪些 - 工业设备
  • 2026年比较好的高空作业平台设备厂家优质供应商推荐榜 - 品牌鉴赏师