本次为大家带来的是bdpq游戏中偶数边长矩阵的解题基本思路,希望这份攻略能为大家提供一些启发,帮助大家更好地应对游戏中的挑战。本篇将专注于偶数边长的解法,暂不涉及奇数边长的情况。
首先,当矩阵的边长为偶数时,我们可以得出一个重要的结论:
假设我们想要将第二行、第三列的一个 ‘p’ 变为 ‘q’,那么只需对第二行和第三列的所有格子都执行一次向右翻转操作。但需要注意的是,第二行、第三列的那个目标格子只能被翻转一次(具体示例如下图,以 4 * 4 矩阵为例,蓝色代表目标格子,所有被染色的格子都需翻转一次)。这样操作后,我们会发现除了第二行、第三列的目标格子变成了 ‘q’ 之外,其余所有格子都保持不变。

这是因为,除了蓝色格子被翻转了奇数次(n+n-1次)外,其他所有格子都被翻转了偶数次。基于这一原理,如果我们想要将所有格子都变成 ‘p’,可以先将所有 ‘d’ 和 ‘b’ 通过上述方法分别变成 ‘q’ 和 ‘p’,然后再将所有 ‘q’ 变成 ‘p’,即可完成任务。
那么,如果矩阵的边长是奇数,又该如何解决呢?
首先,我们需要明确的是,给定的矩阵一定存在可行解。
对于奇数边长的矩阵,假设我们想要将所有格子都变成 ‘p’,可以先将所有的 'd' 和 'b' 标记出来,然后对所有标记的格子执行一次向上或向下的翻转操作。这样操作后,我们一定能得到一个只包含 ‘p’ 和 ‘q’ 的矩阵。接下来,我们再次标记所有的 ‘q’,并对所有标记的格子执行一次向左或向右的翻转操作,这样最终一定能得到一个全是 ‘p’ 的矩阵。
以下是C++代码示例,供大家参考:
运行图:
奇数矩阵:

偶数矩阵:

///奇数解
#include<bits/stdc++.h>
using namespace std;
int ans[5][5][5];
char mmp[10][10];
int N;
void Flip(int x,int y){
for(int i = 1;i <= N;i ++){
if(mmp[x][i] == 'b'){mmp[x][i] = 'p';}
else if(mmp[x][i] == 'd'){mmp[x][i] = 'q';}
if(mmp[i][y] == 'b'){mmp[i][y] = 'p';}
else if(mmp[i][y] == 'd'){mmp[i][y] = 'q';} }
if(mmp[x][y] == 'b'){mmp[x][y] = 'p';}
else if(mmp[x][y] == 'd'){mmp[x][y] = 'q';} }
void solve(queue<pair<int,int> > Q,int k){ while(Q.size()){ pair<int,int> t = Q.front(); Q.pop(); ans[k][t.first][t.second] = 1 - ans[k][t.first][t.second]; Flip(t.first,t.second); } }
int main(){ while(cin >> N){ memset(ans,0,sizeof ans); for(int i = 1;i <= N;i ++){ scanf("%s",mmp[i] + 1); }
queue <pair<int,int> > Q;
for(int i = 1;i <= N;i ++){ for(int j = 1;j <= N;j ++){ if(mmp[i][j] == 'b' || mmp[i][j] == 'd'){ Q.push(make_pair(i,j)); } } } solve(Q,1);
while(Q.size()){Q.pop();}
for(int i = 1;i <= N;i ++){ for(int j = 1;j <= N;j ++){ if(mmp[i][j] == 'q'){ Q.push(make_pair(i,j)); } } } solve(Q,2);
for(int k = 1;k < 3;k ++){ if(k == 1){printf("flip it down or up :n");}
else{printf("flip it right or left :n");}
for(int i = 1;i <= N;i ++){ for(int j = 1;j <= N;j ++){ cout << ans[k][i][j] << " "; }cout << endl; } } } return 0; }
///偶数解
#include<bits/stdc++.h> using namespace std;
int ans[5][5][5];
char mmp[10][10];
int N;
void solve(int k,int x,int y){ for(int i = 1;i <= N;i ++){ ans[k][x][i] = 1 - ans[k][x][i]; ans[k][i][y] = 1 - ans[k][i][y]; } ans[k][x][y] = 1 - ans[k][x][y]; } int main(){ while(cin >> N){ memset(ans,0,sizeof ans);
for(int i = 1;i <= N;i ++){ scanf("%s",mmp[i] + 1); }
for(int i = 1;i <= N;i ++){ for(int j = 1;j <= N;j ++){ if(mmp[i][j] == 'b' || mmp[i][j] == 'd'){ solve(1,i,j); if(mmp[i][j] == 'b'){mmp[i][j] = 'p';}
else if(mmp[i][j] == 'd'){mmp[i][j] = 'q';} } } }
for(int i = 1;i <= N;i ++){ for(int j = 1;j <= N;j ++){ if(mmp[i][j] == 'q'){ solve(2,i,j); } } }
for(int k = 1;k < 3;k ++){ if(k == 1){printf("flip it down or up :n");} else{printf("flip it right or left :n");}
for(int i = 1;i <= N;i ++){ for(int j = 1;j <= N;j ++){ cout << ans[k][i][j] << " "; }cout << endl; } } } return 0; } [/x]
上一篇: 神脑洞游戏第74关答案 74关怎么过
下一篇: 碧蓝航线特别庆典再开指定SSR选谁
2026-05-22
风云岛行动吃鸭指南 新手吃鸭攻略大全
原神旅人的羽饰怎么样
暴走大侠七星剑阵怎么得
明日方舟火蓝之心复刻全关卡攻略汇总大全
星露谷物语手游攻略
古代人生鬼市怎么去 鬼市攻略
光遇祈愿动作怎么获得
龙族幻想性别体型转换功能详解
崩坏3通灵妖兽绯狱打法攻略
三国志战略版s3赛季怎么开荒
原神旅人的羽饰怎么样
风云岛行动吃鸭指南 新手吃鸭攻略大全
明日方舟火蓝之心复刻全关卡攻略汇总大全
星露谷物语手游攻略
光遇祈愿动作怎么获得
龙族幻想性别体型转换功能详解
崩坏3通灵妖兽绯狱打法攻略
古代人生鬼市怎么去 鬼市攻略