平分汽油问题
一只大桶里盛着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(i0;i3;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

相关新闻

Python Any类型注解(Ptyhon typing.Any、Python类型提示、万能类型提示、typing模块、Any陷阱、# type: ignore)

Python Any类型注解(Ptyhon typing.Any、Python类型提示、万能类型提示、typing模块、Any陷阱、# type: ignore)

文章目录Python类型提示中的Any:灵活与责任的平衡一、什么是 Any?—— 一个“万能”类型提示二、为什么需要 Any?—— 真实使用场景✅ 场景 1:动态类型数据源(如JSON API)✅ 场景 2:与动态库交互…

2026/7/5 1:55:35 阅读更多 →
Rust中 引用类型 VS 裸指针

Rust中 引用类型 VS 裸指针

在Rust的内存安全模型中,引用类型和裸指针是两种用于间接访问数据的核心方式——引用类型是Rust安全编程的基石,依托所有权与生命周期机制保障内存安全;裸指针则是突破安全约束、对接底层开发的“一把钥匙”,允许开发者直接操作内…

2026/5/17 4:36:40 阅读更多 →
基于微信小程序的CET助手设计与实现

基于微信小程序的CET助手设计与实现

一、项目技术介绍 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Ma…

2026/5/17 4:36:40 阅读更多 →

最新新闻

AI大模型驱动自动化测试:Claude+Playwright+MCP架构实战解析

AI大模型驱动自动化测试:Claude+Playwright+MCP架构实战解析

1. 项目概述:当AI大模型遇上自动化测试最近在测试圈子里,一个组合开始频繁被提及:Claude Playwright MCP。这听起来像是一堆技术名词的堆砌,但如果你深入了解一下,会发现它正在悄然改变我们编写和执行自动化测试脚本…

2026/7/5 9:34:39 阅读更多 →
NCM加密音乐文件本地化转换方案:从原理到自动化实践

NCM加密音乐文件本地化转换方案:从原理到自动化实践

1. 项目概述:从“加密枷锁”到“自由播放”如果你是一个音乐爱好者,尤其是网易云音乐的重度用户,那么你大概率在电脑的某个角落发现过一些以.ncm为后缀的奇怪文件。这些文件直接双击无法用常规播放器打开,想导入手机或车载U盘更是…

2026/7/5 9:32:39 阅读更多 →
RevokeMsgPatcher防撤回补丁:原理、风险与Windows微信/QQ/TIM实操指南

RevokeMsgPatcher防撤回补丁:原理、风险与Windows微信/QQ/TIM实操指南

1. 项目概述:为什么我们需要一个“防撤回补丁”? 在即时通讯软件里,“消息撤回”功能设计的初衷是给用户一个纠正错误的机会,比如打错字、发错人或者一时冲动说了不合适的话。但很多时候,这个功能也带来了信息不对等的…

2026/7/5 9:28:38 阅读更多 →
Folia:全屏沉浸式在线音乐播放器,多端体验+AI 主题生成带来独特听歌感受!

Folia:全屏沉浸式在线音乐播放器,多端体验+AI 主题生成带来独特听歌感受!

Folia 是一款以全屏沉浸式歌词播放为核心的在线音乐播放器,支持多平台,具备智能歌词匹配、AI 生成配色主题等功能,为用户带来独特听歌体验。项目亮点与特色Folia 支持网易云、navidrome 和本地音乐库。其独特之处在于智能歌词匹配&#xff0c…

2026/7/5 9:26:38 阅读更多 →
SQL注入攻防全解析:从原理到实战,掌握Web安全核心漏洞

SQL注入攻防全解析:从原理到实战,掌握Web安全核心漏洞

1. 项目概述:为什么SQL漏洞是面试官的“心头好”? 干了这么多年安全,也面过不少人,我发现一个挺有意思的现象:无论你是应聘渗透测试、安全开发还是安全运维,面试官几乎都会把SQL注入漏洞拎出来问一遍。从“…

2026/7/5 9:26:37 阅读更多 →
Weex架构安卓商城APP逆向工程包:含完整源码结构、APK资源解包与AndroidX/Support双兼容支持

Weex架构安卓商城APP逆向工程包:含完整源码结构、APK资源解包与AndroidX/Support双兼容支持

本文还有配套的精品资源,点击获取 简介:一套真实上线商城App的逆向分析成果,主逻辑基于Weex框架(main.js驱动),集成weex-main-jsfm.js、weex-rax-api.js等核心运行时模块,支持RAX组件开发&am…

2026/7/5 9:20:36 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻