DFS-翻金币--总共可能性?

  1. 添加了 printGrid 函数,用于输出当前的网格状态。
  2. 在 dfsIterative 函数中,在记录状态后调用 printGrid 打印每次翻转后的状态。
    #include <iostream>  
    #include <vector>  
    #include <set>  
    #include <stack>  
    
    const int SIZE = 4;
    const int DIRECTIONS[5][2] = { {0, 0}, {1, 0}, {0, 1}, {-1, 0}, {0, -1} };
    
    // 翻转金币的函数,并输出当前网格状态  
    void flip(std::vector<std::vector<bool>>& grid, int x, int y) {
        for (int d = 0; d < 5; ++d) {
            int nx = x + DIRECTIONS[d][0];
            int ny = y + DIRECTIONS[d][1];
            if (nx >= 0 && nx < SIZE && ny >= 0 && ny < SIZE) {
                grid[nx][ny] = !grid[nx][ny];
            }
        }
    }
    
    // 打印当前网格状态  
    void printGrid(const std::vector<std::vector<bool>>& grid) {
        for (int i = 0; i < SIZE; ++i) {
            for (int j = 0; j < SIZE; ++j) {
                std::cout << (grid[i][j] ? '1' : '0') << " "; // 1 表示金币, 0 表示空位  
            }
            std::cout << std::endl;
        }
        std::cout << "-----------------" << std::endl; // 分隔行  
    }
    
    // 将当前网格状态转换为字符串  
    std::string gridToString(const std::vector<std::vector<bool>>& grid) {
        std::string result;
        for (int i = 0; i < SIZE; ++i) {
            for (int j = 0; j < SIZE; ++j) {
                result += (grid[i][j] ? '1' : '0'); // 1 表示金币, 0 表示空位  
            }
        }
        return result;
    }
    
    // 迭代 DFS,记录状态  
    void dfsIterative(std::set<std::string>& uniqueStates) {
        std::stack<std::pair<std::vector<std::vector<bool>>, int>> stack;
    
        // 初始化网格:全是金币  
        std::vector<std::vector<bool>> initialGrid(SIZE, std::vector<bool>(SIZE, true));
        stack.push({ initialGrid, 0 }); // 存储初始状态与下一个点击的位置  
    
        while (!stack.empty()) {
            auto current = stack.top();
            // 访问当前网格和下一个位置  
            std::vector<std::vector<bool>>& currentGrid = current.first;
            int nextPos = current.second;
            stack.pop();
    
            // 将当前状态转换为字符串并插入集合  
            uniqueStates.insert(gridToString(currentGrid));
            // 打印当前网格状态  
            printGrid(currentGrid);
    
            // 遍历所有可能的点击位置  
            for (int i = nextPos; i < SIZE * SIZE; ++i) {
                int x = i / SIZE;
                int y = i % SIZE;
    
                // 点击 (x, y) 的金币  
                flip(currentGrid, x, y);
                stack.push({ currentGrid, i + 1 }); // 继续从下一个位置搜索  
                // 翻转回去以还原状态  
                flip(currentGrid, x, y);
            }
        }
    }
    
    int main() {
        // 集合用于存储唯一状态  
        std::set<std::string> uniqueStates;
    
        // 开始迭代 DFS  
        dfsIterative(uniqueStates);
    
        // 输出结果  
        std::cout << "Total unique configurations: " << uniqueStates.size() << std::endl;
    
        return 0;
    }

    输出结果:xxxx 4096

  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值