3777.砖块

[3777. 砖块 - AcWing题库]:

n 个砖块排成一排,从左到右编号依次为 1∼n。

每个砖块要么是黑色的,要么是白色的。

现在你可以进行以下操作若干次(可以是 0 次):

选择两个相邻的砖块,反转它们的颜色。(黑变白,白变黑)

你的目标是通过不超过 3n 次操作,将所有砖块的颜色变得一致。

输入格式

第一行包含整数 T表示共有 T 组测试数据。

每组数据第一行包含一个整数 n。

第二行包含一个长度为 n 的字符串 s。其中的每个字符都是 WB,如果第 i 个字符是 W,则表示第 i号砖块是白色的,如果第 i个字符是 B,则表示第 i个砖块是黑色的。

输出格式

每组数据,如果无解则输出一行 −1。

否则,首先输出一行 k,表示需要的操作次数。

如果 k>0,则还需再输出一行 k 个整数,p1,p2,…,pk。其中 pi表示第 i 次操作,选中的砖块为 pi 和 pi+1 号砖块。

如果方案不唯一,则输出任意合理方案即可。

数据范围

1≤T≤10
2≤n≤200

输入样例:

4
8
BWWWWWWB
4
BWBB
5
WWWWW
3
BWB

输出样例:

3
6 2 4
-1
0
2
2 1

Code:

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

char str[205];          //字符串

bool check(char ch, int n){     //检查是否为全Ch样式
    char s[205];        //临时字符串
    int mark[n];        //修改记录
    strcpy(s+1, str+1); //复制原串
    int i, step = 0;
    for(i = 1; i < n; i++){     //从第一个块开始逐个检查 不是该Ch样式则修改后一个块的值
        if(s[i] != ch){
            if(s[i+1] == 'W') s[i+1] = 'B';
            else s[i+1] = 'W';
            mark[step] = i;         //记录修改的点
            step++;                 //修改次数加1
        } 
    }
    if(s[i] != ch) return false;        //最后一个字符不是CH
    printf("%d\n", step);               //输出次数和修改的点
    for(i = 0; i < step; i++){
        printf("%d ", mark[i]);
    }
    return true;
}

int main(){
    int t;
    scanf("%d\n", &t);
    while(t--){
    	int n;
        scanf("%d", &n);
        scanf("%s", str+1);
        if(!check('W', n) && !check('B', n)) printf("-1");      //两种颜色都没有 则输出-1
        putchar('\n');
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
砖块是一款经典的游戏,通过qt.4可以很容易地实现这个游戏。下面是一个简单的打砖块游戏示例: 首先,我们需要一个主窗口,可以使用QMainWindow类来实现。在主窗口中,我们需要绘制游戏区域和球、板、砖块等游戏元素。可以使用QPainter类来进行绘制。 接着,我们需要定义游戏逻辑。游戏逻辑包括球的运动轨迹、板的移动、砖块的消除等。当球碰到砖块时,砖块会消失,并且玩家得分增加。当球碰到板时,球的运动方向会改变。如果球碰到边界,游戏失败。 最后,我们需要添加交互逻辑。玩家可以通过键盘控制板的移动。可以使用QKeyEvent类来实现键盘事件的处理。 下面是一个简单的示例代码,仅供参考: ```cpp #include <QtGui> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); protected: void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent *event); private: int ball_x, ball_y; int ball_dx, ball_dy; int board_x, board_y; int board_dx; int brick[5][10]; int score; void initGame(); void updateGame(); }; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setFixedSize(400, 400); setWindowTitle("打砖块"); initGame(); QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(updateGame())); timer->start(20); } void MainWindow::paintEvent(QPaintEvent *event) { QPainter painter(this); // 绘制游戏区域 painter.setPen(Qt::black); painter.drawRect(0, 0, 400, 400); // 绘制球 painter.setBrush(Qt::red); painter.drawEllipse(ball_x, ball_y, 10, 10); // 绘制板 painter.setBrush(Qt::blue); painter.drawRect(board_x, board_y, 60, 10); // 绘制砖块 for (int i = 0; i < 5; i++) { for (int j = 0; j < 10; j++) { if (brick[i][j] > 0) { QRect rect(j*40, i*20, 40, 20); painter.setBrush(Qt::green); painter.drawRect(rect); } } } // 绘制得分 painter.setPen(Qt::red); painter.drawText(10, 390, QString("Score: %1").arg(score)); } void MainWindow::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Left) { board_dx = -5; } else if (event->key() == Qt::Key_Right) { board_dx = 5; } } void MainWindow::initGame() { ball_x = 190; ball_y = 290; ball_dx = 5; ball_dy = -5; board_x = 170; board_y = 380; board_dx = 0; for (int i = 0; i < 5; i++) { for (int j = 0; j < 10; j++) { brick[i][j] = 1; } } score = 0; } void MainWindow::updateGame() { // 移动球 ball_x += ball_dx; ball_y += ball_dy; // 碰到边界 if (ball_x < 0 || ball_x > 390) { ball_dx = -ball_dx; } if (ball_y < 0) { ball_dy = -ball_dy; } if (ball_y > 390) { initGame(); return; } // 碰到板 QRect rect(board_x, board_y, 60, 10); if (rect.intersects(QRect(ball_x, ball_y, 10, 10))) { ball_dy = -ball_dy; } // 碰到砖块 int row = ball_y / 20; int col = ball_x / 40; if (row >= 0 && row < 5 && col >= 0 && col < 10 && brick[row][col] > 0) { brick[row][col] = 0; ball_dy = -ball_dy; score += 10; } // 移动板 board_x += board_dx; if (board_x < 0 || board_x > 340) { board_dx = 0; } update(); } int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow window; window.show(); return app.exec(); } ``` 在上面的代码中,我们使用了QTimer类来定时更新游戏状态,使用QKeyEvent类来处理键盘事件,使用QPainter类来进行游戏元素的绘制。通过以上的代码,我们就可以打造出一个简单的打砖块游戏了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时屿.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值