題目描述:
小藍用黑白棋的n個棋子排成了一行,他在腦海里想象出了一個長度為n的01串T,他發(fā)現(xiàn)如果把黑棋當(dāng)做1,白棋當(dāng)做0,這一行棋子也是一個長度為n 的01串S。
小藍決定,如果在S中發(fā)現(xiàn)一個棋子和它兩邊的棋子都不一樣,就可以將其翻轉(zhuǎn)變成另一個顏色。也就是說,如果S中存在子串101或者010,就可以選擇將其分別變?yōu)?11和000,這樣的操作可以無限重復(fù)。
小藍想知道最少翻轉(zhuǎn)多少次可以把S變成和T一模一樣。
輸入格式:
輸入包含多組數(shù)據(jù)。
輸入的第一行包含一個正整數(shù)D表示數(shù)據(jù)組數(shù)。
后面 2D 行每行包含一個01串,每兩行為一組數(shù)據(jù),第2*i-1行為第i組數(shù)據(jù)的T,第 2*i行為第i組數(shù)據(jù)的 Si,S?和T 長度均為ni文章來源:http://www.zghlxwxcb.cn/news/detail-814653.html
輸出格式:
對于每組數(shù)據(jù),輸出一行包含一個整數(shù),表示答案,如果答案不存在請輸出 -1。文章來源地址http://www.zghlxwxcb.cn/news/detail-814653.html
大體思路 :?
1、這個題關(guān)鍵就是讀懂題找到誰是T誰是S 2、還有以誰為基準的對應(yīng)關(guān)系即可解題
AC代碼如下:?
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
n = n*2;
string s[n];
for(int i=0;i<n;i++) cin >> s[i];
//這里的i+=2很巧妙,可以手算模擬一下
for (int i = 1; i < n; i +=2 )
{
int k = 0;
int cnt = 0;//計算改變次數(shù)
bool is_same = true;
while(k<s[i].size())
{
//我們可以發(fā)現(xiàn) 一個規(guī)律就是如果前面兩個數(shù)不一樣
//那一定是不行的
if(s[i][0] != s[i-1][0])
{
is_same = false;
break;
}
else
{
k++;
//跟前后去做比較
if(s[i][k] != s[i-1][k])
{
if(s[i][k] != s[i][k-1] && s[i][k] != s[i][k+1] && s[i][k-1] == s[i][k+1])
{
if(s[i][k] == '0')
{
s[i][k] = '1';
cnt++;
}
else
{
s[i][k] = '0';
cnt++;
}
}
}
}
}
if(s[i] != s[i-1]) is_same = false;
if(is_same) cout << cnt << endl;
else cout << "-1" << endl;
}
return 0;
}
到了這里,關(guān)于第十四屆藍橋杯省賽PythonA/C組------翻轉(zhuǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!