Player1's Code:
//This is GPT Solution... using System; using System.Collections.Generic; using System.Linq; namespace Solution { public class Stratego { // تابع اصلی که حرکت بهینه را انجام میدهد. public static int[] Player(int Dice1, int Dice2, int[] YourCards, int[] OpponentCards) { int target = Dice1 + Dice2; List
hand = new List
(YourCards); // تولید تمام زیرمجموعههایی از کارتها که مجموع آنها برابر با target شود. List
> candidateMoves = new List
>(); int n = hand.Count; // با استفاده از بیتماسک تمام زیرمجموعهها را بررسی میکنیم. for (int mask = 1; mask < (1 << n); mask++) { int sum = 0; List
subset = new List
(); for (int i = 0; i < n; i++) { if ((mask & (1 << i)) != 0) { sum += hand[i]; subset.Add(hand[i]); } } if (sum == target) candidateMoves.Add(subset); } // اگر هیچ حرکت قانونی وجود نداشته باشد، دست فعلی را بدون تغییر برگردانیم. if (candidateMoves.Count == 0) return YourCards; // محاسبه پتانسیل دست حریف (تعداد مجموعهای ممکن از کارتهای حریف در بازه 2 تا 12) int opponentPotential = CalculatePotential(OpponentCards); double bestScore = double.MinValue; List
bestMove = null; // ارزیابی هر حرکت ممکن با استفاده از معیارهای گفته شده. foreach (var move in candidateMoves) { // ایجاد دست جدید با حذف کارتهای انتخابشده List
newHand = new List
(hand); foreach (int card in move) newHand.Remove(card); int cardsRemoved = move.Count; // تعداد کارتهای حذفشده int potentialNew = CalculatePotential(newHand.ToArray()); bool hasSeven = newHand.Contains(7); int newCount = newHand.Count; // امتیازدهی: اولویت اصلی حذف بیشتر کارت است؛ // سپس انعطافپذیری دست جدید (potentialNew)؛ // سپس نگهداشتن کارت 7؛ // و در نهایت تعداد کارتهای باقیمانده (کمتر بهتر است). double score = cardsRemoved * (1000 + opponentPotential * 50) + potentialNew * 10 + (hasSeven ? 100 : 0) - newCount; if (score > bestScore) { bestScore = score; bestMove = move; } } // اگر بهترین حرکت پیدا شد، آن را از دست حذف میکنیم. if (bestMove != null) { foreach (int card in bestMove) hand.Remove(card); } // برای خروجی میتوانیم کارتهای باقیمانده را مرتب کنیم. hand.Sort(); return hand.ToArray(); } // تابع کمکی: محاسبه پتانسیل دست (تعداد مقادیر بین 2 تا 12 که با زیرمجموعههای کارتها قابل ساخت است) private static int CalculatePotential(int[] cards) { HashSet
sums = new HashSet
(); int n = cards.Length; // بررسی تمام زیرمجموعهها (به جز زیرمجموعه تهی) for (int mask = 1; mask < (1 << n); mask++) { int sum = 0; for (int i = 0; i < n; i++) { if ((mask & (1 << i)) != 0) sum += cards[i]; } if (sum >= 2 && sum <= 12) sums.Add(sum); } return sums.Count; } } }
Player2's Code:
//This is DeepSeek Solution... using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Solution { public class Stratego { public static int[] Player(int Dice1, int Dice2, int[] YourCards, int[] OpponentCards) { int targetSum = Dice1 + Dice2; List
remainingCards = YourCards.ToList(); // تمام ترکیبات ممکن برای رسیدن به مجموع هدف را پیدا کن var allValidCombinations = FindAllSubsets(remainingCards, targetSum); if (allValidCombinations.Count == 0) return remainingCards.ToArray(); // هیچ ترکیبی ممکن نیست // بهترین ترکیب را انتخاب کن: بیشترین تعداد کارت + اولویت کارتهای بزرگتر var bestCombination = allValidCombinations .OrderByDescending(comb => comb.Count) // اولویت با تعداد بیشتر .ThenByDescending(comb => comb.Sum()) // اگر تعداد برابر بود، مجموع بزرگتر .First(); // کارتهای انتخابی را حذف کن foreach (int card in bestCombination) { remainingCards.Remove(card); } return remainingCards.ToArray(); } // تابع کمکی برای پیدا کردن تمام زیرمجموعههایی که مجموعشان برابر target است private static List
> FindAllSubsets(List
cards, int target) { List
> result = new List
>(); FindSubsets(cards, target, 0, new List
(), result); return result; } // الگوریتم بازگشتی برای تولید زیرمجموعهها private static void FindSubsets(List
cards, int target, int index, List
current, List
> result) { if (target == 0) { result.Add(new List
(current)); return; } for (int i = index; i < cards.Count; i++) { int card = cards[i]; if (card > target) continue; current.Add(card); FindSubsets(cards, target - card, i + 1, current, result); current.RemoveAt(current.Count - 1); } } } }
Download the coding file from here.