編碼也快樂:兩隻水壺C#程式
我的 C# 程式:
using System;
using System.Collections.Generic;
static class Pot2
{
static int[] Max = { 5, 6 }; // 每隻壺的最大容量,可為任意正整數
static int[] Pot = { 0, 0 }; // 每隻壺的當前水位
static List<int[]> SL = new List<int[]>(); // 記錄水位
static List<int[]> SA = new List<int[]>(); // 記錄動作
static void Main()
{
Pot[0] = 3; // <------ 這是要從池塘中取的水量,可為任意正整數
if (Pot[0] < 0 || Pot[0] > Max[0] || Pot[1] < 0 || Pot[1] > Max[1])
{
Console.WriteLine("引數超過允許範圍。");
return;
}
// 如果水量不是兩隻壺的最大容量的最大公約數的整數倍,則無解
if ((Pot[0] + Pot[1]) % Gcd(Max[0], Max[1]) != 0)
{
Console.WriteLine("無解。");
return;
}
SL.Add(new int[]{ Pot[0], Pot[1] });
Solve();
SA.Add(new int[]{ 0, 0 });
Print();
}
// 返回兩個非負整數的最大公約數
static int Gcd(int a, int b)
{
if (b == 0) return a;
return Gcd(b, a % b);
}
// 解題:反過來思考,先假設已成功,如果最後能得到兩隻空壺就OK了
static void Solve()
{
if (Pot[0] == 0 && Pot[1] == 0) return;
else if (Pot[0] == 0 && Pot[1] == Max[1]) Del(1);
else if (Pot[1] == 0 && Pot[0] == Max[0]) Del(0);
else if (Pot[0] == 0 || Pot[1] == 0)
{
int i = (Pot[0] == 0) ? 0 : 1;
int j = (Pot[0] == 0) ? 1 : 0;
Add(i);
while (Pot[i] > 0)
{
Mov(i);
if (Pot[j] == Max[j]) Del(j);
}
if (Pot[i] == 0 && Pot[j] == 0) return;
}
else return;
Solve();
}
// 第i壺加滿水
static void Add(int i)
{
Pot[i] = Max[i];
SL.Add(new int[]{ Pot[0], Pot[1] });
SA.Add(new int[]{ 1, i });
}
// 清空第i壺
static void Del(int i)
{
Pot[i] = 0;
SL.Add(new int[]{ Pot[0], Pot[1] });
SA.Add(new int[]{ 2, i });
}
// 第i壺的水儘量倒住另一壺
static void Mov(int i)
{
int j = (i + 1) % 2;
int x = Math.Min(Max[j] - Pot[j], Pot[i]);
Pot[i] -= x;
Pot[j] += x;
SL.Add(new int[] { Pot[0], Pot[1] });
SA.Add(new int[] { 3, j });
}
static string[] Action = {"初始狀態 ", "清空第{0}壺 ", "加滿第{0}壺 ", "第{0}壺倒往另一壺"};
// 列印解題過程
static void Print()
{
Console.WriteLine("兩隻壺的最大容量分別是 -- [{0}, {1}]", Max[0], Max[1]);
// 實際操作是前面的解題過程的逆序,因為解題思路是反過來考慮的。
for (int i = SL.Count - 1; i > 0; i--)
{
Console.Write("步驟{0,2} ", SL.Count - 1 - i);
Console.Write(Action[SA[i][0]], SA[i][1] + 1);
Console.WriteLine(" -> ({0}, {1})", SL[i][0], SL[i][1]);
}
Console.WriteLine("成功!");
}
}
輸出:
兩隻壺的最大容量分別是 -- [5, 6]
步驟 0 初始狀態 -> (0, 0)
步驟 1 加滿第1壺 -> (5, 0)
步驟 2 第1壺倒往另一壺 -> (0, 5)
步驟 3 加滿第1壺 -> (5, 5)
步驟 4 第1壺倒往另一壺 -> (4, 6)
步驟 5 清空第2壺 -> (4, 0)
步驟 6 第1壺倒往另一壺 -> (0, 4)
步驟 7 加滿第1壺 -> (5, 4)
步驟 8 第1壺倒往另一壺 -> (3, 6)
成功!
社群的程式碼字型似乎是兩個半形字元比一個全形字元略寬,沒能對齊。
相關文章
- 編碼也快樂:兩隻水壺F#程式
- 編碼也快樂:兩隻水壺Scheme程式Scheme
- 程式設計也快樂: 兩隻水壺 C程式碼 搜尋版程式設計C程式
- 編碼也快樂:兩水壺的故事之JS程式JS
- 兩隻水壺 c++版C++
- 編碼也快樂:取得3升水C#版C#
- 編碼也快樂活動:撲克牌排序排序
- 編碼也快樂!撲克牌排序JAVA排序Java
- 編碼也快樂:撲克牌排序 - Python排序Python
- 編碼也快樂活動:撲克牌排序(JavaScript)排序JavaScript
- 撲克牌排序(JS版) 編碼也快樂!排序JS
- 程式設計也快樂第3期SQL程式碼程式設計SQL
- 買這家公司的遊戲,還不如買兩瓶快樂水?遊戲
- Tita智慧濾水壺:全家健康飲水靠它就夠了
- 程式設計也快樂第三期解答(四)程式設計
- 程式設計也快樂第三期解答(三)程式設計
- 程式設計也快樂第三期解答(二)程式設計
- 程式設計也快樂第三期解答(一)程式設計
- SQLSERVER 居然也能調 C# 程式碼 ?SQLServerC#
- 編碼也快樂活動歡樂第二季 - 火熱滾燙的HTML5和CSS3大餐...HTMLCSSS3
- 不再做夢,快樂程式碼到此為止!
- 編寫更好的C#程式碼C#
- VB.net 編碼規範(也適用於C#) (轉)C#
- 程式設計師快樂器之JAVA程式碼生成工具程式設計師Java
- 程式設計師節快樂程式設計師
- (程式碼生成)JS寫的程式碼生成器-編碼也可以這麼爽..JS
- 米家新電水壺釋出:標準米家風格定價99元
- 小米米家恆溫電水壺釋出:199元帶回家
- 《快樂碼農》第7期 嘗試在帳篷中寫程式碼
- 編寫高效能C#程式碼 —— Span<T>C#
- NEON彙編比純C程式碼快17倍!C程式
- 22種程式語言新年快樂
- 使用Google Guava快樂程式設計GoGuava程式設計
- 程式猿1024節快樂
- 程式設計師的快樂生活程式設計師
- 快樂指南:程式設計師版程式設計師
- 《快樂碼農》第5期 大話程式設計師面試程式設計師面試
- 通達信兩隻喜鵲指標公式原始碼副圖指標公式原始碼