473. Matchsticks to Square

class Solution {
public:
    bool makesquare(vector<int>& nums) {
        if(nums.empty()||nums.size()==0)
            return false;
        int length=0;
        vector<int> sum(4,0);
        for(int i=0;i<nums.size();i++)
            length += nums[i];
        if(length%4==0)
            length /= 4;
        else
            return false;
        return Dfs(nums,sum,0,length);
    }
    bool Dfs(vector<int>& nums,vector<int>& sum,int index,int length){
        if(index==nums.size())
            if(sum[0]==sum[1] && sum[1]==sum[2] && sum[2]==sum[3] && sum[3]==length)
                return true;
            else
                return false;
        for(int i=0;i<4;i++){
            if(sum[i]+nums[index]>length)
                continue;
            sum[i] += nums[index];
            if(Dfs(nums,sum,index+1,length))
                return true;
            else
                sum[i] -= nums[index];
        }
        return false;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面给出一个简单的 Java Swing 代码实现: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MatchsticksGame extends JFrame { private int totalMatchsticks, maxMatchsticksPerTurn; private boolean computerFirst; private JLabel statusLabel, matchsticksLabel; private JButton takeButton; private JTextArea historyTextArea; private int currentMatchsticks, turnCount; private boolean isComputerTurn, gameOver; public MatchsticksGame(int totalMatchsticks, boolean computerFirst, int maxMatchsticksPerTurn) { super("Matchsticks Game"); this.totalMatchsticks = totalMatchsticks; this.computerFirst = computerFirst; this.maxMatchsticksPerTurn = maxMatchsticksPerTurn; currentMatchsticks = totalMatchsticks; turnCount = 0; isComputerTurn = computerFirst; gameOver = false; statusLabel = new JLabel("Game started. " + (isComputerTurn ? "Computer" : "User") + " goes first."); matchsticksLabel = new JLabel(getMatchsticksString(currentMatchsticks)); takeButton = new JButton("Take"); takeButton.addActionListener(new TakeButtonListener()); historyTextArea = new JTextArea(10, 40); historyTextArea.setEditable(false); JScrollPane scrollPane = new JScrollPane(historyTextArea); JPanel topPanel = new JPanel(); topPanel.add(statusLabel); topPanel.add(Box.createHorizontalStrut(20)); topPanel.add(takeButton); topPanel.add(Box.createHorizontalStrut(20)); topPanel.add(matchsticksLabel); JPanel bottomPanel = new JPanel(); bottomPanel.add(scrollPane); setLayout(new BorderLayout()); add(topPanel, BorderLayout.NORTH); add(bottomPanel, BorderLayout.SOUTH); pack(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); if (computerFirst) { takeMatches(computeBestMove()); isComputerTurn = false; } } private String getMatchsticksString(int count) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < count; i++) { sb.append("| "); } return sb.toString(); } private int computeBestMove() { // TODO: Implement Minimax algorithm to compute best move return 1; } private void takeMatches(int count) { int actualCount = Math.min(count, maxMatchsticksPerTurn); currentMatchsticks -= actualCount; matchsticksLabel.setText(getMatchsticksString(currentMatchsticks)); historyTextArea.append((isComputerTurn ? "Computer" : "User") + " takes " + actualCount + " matchsticks.\n"); if (currentMatchsticks == 1) { gameOver = true; statusLabel.setText((isComputerTurn ? "Computer" : "User") + " wins!"); historyTextArea.append((isComputerTurn ? "Computer" : "User") + " wins!\n"); takeButton.setEnabled(false); } else { isComputerTurn = !isComputerTurn; statusLabel.setText("Current turn: " + (isComputerTurn ? "Computer" : "User")); if (isComputerTurn) { takeMatches(computeBestMove()); } } } private class TakeButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { if (!gameOver && !isComputerTurn) { try { int count = Integer.parseInt(JOptionPane.showInputDialog("Please enter the number of matchsticks to take:")); if (count < 1 || count > maxMatchsticksPerTurn || count > currentMatchsticks - 1) { JOptionPane.showMessageDialog(null, "Invalid number of matchsticks. Please try again."); } else { takeMatches(count); } } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(null, "Invalid number format. Please try again."); } } } } public static void main(String[] args) { int totalMatchsticks = Integer.parseInt(JOptionPane.showInputDialog("Please enter the total number of matchsticks:")); boolean computerFirst = JOptionPane.showConfirmDialog(null, "Do you want the computer to go first?", "Choose", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION; int maxMatchsticksPerTurn = Integer.parseInt(JOptionPane.showInputDialog("Please enter the maximum number of matchsticks per turn:")); new MatchsticksGame(totalMatchsticks, computerFirst, maxMatchsticksPerTurn); } } ``` 这个代码实现了一个简单的图形界面,用户可以输入游戏参数,并通过按钮和文本框与计算机进行交互。具体来说,用户每次点击按钮,程序会弹出一个对话框让用户输入拿走的火柴数,然后根据用户的输入更新游戏状态。在计算机回合时,程序会使用 Minimax 算法计算最优决策,并自动更新游戏状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值