蓝桥杯——1.7飞行员兄弟

题目描述:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bPtI3Vhx-1637481991686)(C:\Users\33385\AppData\Roaming\Typora\typora-user-images\image-20211121160529473.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5IhicOIa-1637481991690)(C:\Users\33385\AppData\Roaming\Typora\typora-user-images\image-20211121160543609.png)]

AC代码(DFS)

#include <iostream>
#include <vector>

using namespace std;

typedef pair<int, int> PII;

vector<PII> ans, tmp;

const int N = 5; 
char g[N][N];

void turn_one(int x, int y)
{
    
    
    if (g[x][y] == '+')
        g[x][y] = '-';
    else 
        g[x][y] = '+';
}

void turn_all(int x, int y)
{
    
    
    for (int i = 0; i < 4; i ++)
        turn_one(x, i);
    for (int i = 0; i < 4; i ++)
        turn_one(i, y);
    
    turn_one(x, y);                     // 这个点翻转了两次,因此需要翻转回来
}

void dfs(int x, int y)
{
    
    
    if (x == 3 && y == 4)               // 这里是递归的终点
    {
    
    
        bool success = true;
        for (int i = 0; i < 4; i ++)
            for (int j = 0; j < 4; j ++)
                if (g[i][j] == '+')
                    success = false;
                    
        if (success)
            ans = tmp;
        return ;
    }
    
    if (y == 4)                     // 开始遍历下一行
    {
    
    
        x ++;
        y = 0;
    }
    
    // 选择这个开关
    turn_all(x, y);
    tmp.push_back({
    
    x, y});
    dfs(x, y + 1);
    
    // 恢复现场
    tmp.pop_back();
    turn_all(x, y);
    
    // 不选择这个开关
    dfs(x, y + 1);
}

int main()
{
    
    
    for (int i = 0; i < 4; i ++)
        cin >> g[i];
    
    dfs(0, 0);
    
    cout << ans.size() << endl;
    for (int i = 0; i < ans.size(); i ++)   // 我们是从 0,0开始进行遍历,因此需要加1
        cout << ans[i].first + 1<< " " << ans[i].second + 1<< endl;
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_57095511/article/details/121455201
今日推荐