当前位置:首页 > 游戏攻略 > 游戏攻略 > bdpq偶数边长基本思路

bdpq偶数边长基本思路

发布时间:2026-05-18 15:12:39 来源:海洋下载 作者:网络整理

本次为大家带来的是bdpq游戏中偶数边长矩阵的解题基本思路,希望这份攻略能为大家提供一些启发,帮助大家更好地应对游戏中的挑战。本篇将专注于偶数边长的解法,暂不涉及奇数边长的情况。

首先,当矩阵的边长为偶数时,我们可以得出一个重要的结论:

假设我们想要将第二行、第三列的一个 ‘p’ 变为 ‘q’,那么只需对第二行和第三列的所有格子都执行一次向右翻转操作。但需要注意的是,第二行、第三列的那个目标格子只能被翻转一次(具体示例如下图,以 4 * 4 矩阵为例,蓝色代表目标格子,所有被染色的格子都需翻转一次)。这样操作后,我们会发现除了第二行、第三列的目标格子变成了 ‘q’ 之外,其余所有格子都保持不变。

bdpq

这是因为,除了蓝色格子被翻转了奇数次(n+n-1次)外,其他所有格子都被翻转了偶数次。基于这一原理,如果我们想要将所有格子都变成 ‘p’,可以先将所有 ‘d’ 和 ‘b’ 通过上述方法分别变成 ‘q’ 和 ‘p’,然后再将所有 ‘q’ 变成 ‘p’,即可完成任务。

那么,如果矩阵的边长是奇数,又该如何解决呢?

首先,我们需要明确的是,给定的矩阵一定存在可行解。

对于奇数边长的矩阵,假设我们想要将所有格子都变成 ‘p’,可以先将所有的 'd' 和 'b' 标记出来,然后对所有标记的格子执行一次向上或向下的翻转操作。这样操作后,我们一定能得到一个只包含 ‘p’ 和 ‘q’ 的矩阵。接下来,我们再次标记所有的 ‘q’,并对所有标记的格子执行一次向左或向右的翻转操作,这样最终一定能得到一个全是 ‘p’ 的矩阵。

以下是C++代码示例,供大家参考:

运行图:

奇数矩阵:

bdpq

偶数矩阵:

bdpq

///奇数解

#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]

猜你喜欢

更多
  • 热门攻略榜
  • 最新攻略
  • 下载排行榜
  • 热门排行榜

© oceanol.com 

本站所有游戏、应用均来源于网络,仅供个人学习研究使用,版权归原作者所有,如有侵权请联系删除。联系邮箱:283755549@qq.com

2.826001s