1. 程式人生 > >特殊密碼鎖,openjudge全域性題號8496,已AC

特殊密碼鎖,openjudge全域性題號8496,已AC

a:特殊密碼鎖
總時間限制: 1000ms 記憶體限制: 1024kB
描述
有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。


然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的一個按鈕。


當前密碼鎖狀態已知,需要解決的問題是,你至少需要按多少次按鈕,才能將密碼鎖轉變為所期望的目標狀態。


輸入
兩行,給出兩個由0、1組成的等長字串,表示當前/目標密碼鎖狀態,其中0代表凹,1代表凸。
輸出
至少需要進行的按按鈕操作次數,如果無法實現轉變,則輸出impossible。
樣例輸入
011
000
樣例輸出
1




-------------------




## 題目解析
每個按鈕只有兩種狀態,凹或者凸,一旦第一個按鈕的狀態確定,後面的按鈕狀態也隨之確定,就類似於蝴蝶效應,所以一共只有兩種情況,只需判別這兩種情況是否成立,然後取其最小的次數。如果從第三位,第四位等等開始看也一樣。
每一個按鈕都是靠後一個按鈕來確定狀態的,如果符合密碼,則後一個按鈕不動,若不符合,則後一個按鈕翻轉。我們所需做的就是讓當前按鈕之前的按鈕都符合目的密碼,當執行到最後一個按鈕時,如果最後一個按鈕如果符合目的密碼,此種方法即成立,否則不成立。
例如 011 000
第一位不動的情況:
①第一位符合,第二位不翻轉;
②第二位不符合,第三位翻轉,此時為000
③第三位符合,成立,輸出次數。
第一位動:101 ①第一位不符合,第二位翻轉 010 ②第二位不符合,第三位翻轉001 ③第三位不符合,不成立 程式碼如下:
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
int ncase1=1,ncase2=0;//對應第一個按鈕按與不按
string lights;
string resultLights;
string temp;
void Flip(string &s,int i)//翻轉按鈕狀態
{
    int n=s[i]-'0';
    if(n)
        s[i]='0';
    else
        s[i]='1';
}
void Pro(string &s,int len,int &n)//從第二個開關開始進行操作
{
    int i=1;
    while(i<s.length())
    {
        if(s[i-1]!=resultLights[i-1])
        {
        if(s[i-1])
        n++;
        if(i>0)//前一個按鈕翻轉
            Flip(s,i-1);
        if(i<s.length()-1)//後一個翻轉
            Flip(s,i+1);
        Flip(s,i);//當前
        }
        i++;
    }
}
int main()
{
    int ok=0;
    cin>>lights>>resultLights;
     temp=lights;//先把當前狀態儲存
    Flip(temp,0);//按下第一個按鈕
    Flip(temp,1);
    Pro(temp,int(temp.length()),ncase1);
    Pro(lights,int(lights.length()),ncase2);//第一個按鈕沒按的情況
    if(temp==resultLights)
        ok=1;
    else
        ncase1=1000000;//第一個按鈕按下去這種方法不符合,ncase就無限大,作廢
    
    if(lights==resultLights)
        ok=1;
    else
        ncase2=1000000;
    int MIN=min(ncase1,ncase2);
    if(ok)
        cout<<MIN<<endl;
    else
        cout<<"impossible"<<endl;
    return 0;
}


相關推薦

特殊密碼鎖openjudge全域性8496AC

a:特殊密碼鎖 總時間限制: 1000ms 記憶體限制: 1024kB 描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。 然而讓

OpenJudge簡單的整數劃分問題兩種方法(DFS)(動態規劃0ms)全域性7215AC

2:簡單的整數劃分問題 總時間限制: 100ms 記憶體限制: 65536kB描述 將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=n

PAT乙級10013n+1猜想

1.因為要把n最終砍成1,所以如果n不是1的話,要對n進行操作,所以需要一個迴圈語句(for,while) 2.判斷n的奇偶,對奇偶數有不同的處理,所以需要一個選擇語句(if,switch) #include<iostream>using namespace std; int

Freertos-事件標誌組消息隊列二值信互斥信

text pri 消息隊列 解決 消息 無需 出現 任務 一個 任務間的通信和同步機制 在裸機編程時,使用全局變量的確比較方便,但是在加上 RTOS 後就是另一種情況了。 使用全局變量相比事件標誌組主要有如下三個問題: 1、使用事件標誌組可以讓 RTOS 內核有效地管理任

小白一路走來連續刷三年談談我的演算法學習經驗

資料結構與演算法應該算是一個比較難的模組,從小白一路走過來,從大一連續刷過好幾年題,看過挺多書,踩過挺多坑,也漲了一些經驗,姑且在這裡分析一波對資料結構與演算法 的學習經驗,請耐心看完,相信對你會有所幫助。 對於初學者來說,我認為選擇一本合適、不錯的演算法書是非常非常重要的,從大一到現在我也看過不少的演算法書

OpenJudge 8469:特殊密碼鎖

有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。 然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的一個按鈕。 當前

陣列1、

      1.兩數之和 【題目】              【解答】   【分析】題目中沒有說元素能不能重複(為什麼上面的演算法是正確的)。  

html中標籤a中href屬性值的兩種特殊情況空格和井

<a href =" "></a> 預設開啟的還是當前頁面,會重新整理一下重新開啟,會回到頁面頂部。效果相當於F5後重新載入了頁面。 <a href ="#">&l

MyBatis 和 ibatis的動態SQL語句配置符號不相容大於、小於特殊符號問題

在XML對映SQL的檔案中,很多情況下會使用到大於號、小於號等特殊符號,這時候如果不進行控制是無法編譯通過的,這時候需要用到<![CDATA[  ]]>符號進行說明,將此類符號不進行解析,還有一種解決方法就是使用轉移字元,如,案例2,其實,這個問題不止在My

列舉-OpenJudge-8469-特殊密碼鎖

8469:特殊密碼鎖 問題描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成①(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。 然而讓人頭疼的是,②當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按

不錯的遞迴:輸入123返回“321”。 要求必須用遞迴不能用全域性變數輸入必須是一個引數必須返回字串。

題目:輸入123,返回“321”。 要求必須用遞迴,不能用全域性變數,輸入必須是一個引數,必須返回字串。 解析:每次求得最後一個數字然後加遞迴剩餘的數字(每次縮短一個長度)。注意退出的條件是隻剩2位數

openJudge 特殊密碼鎖 ACM

總時間限制:1000ms記憶體限制:1024kB 描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。 然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右

雪花演算法(snowflake) :分散式環境生成全域性唯一的訂單

準備 apache.commons.lang3包 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3&l

openjudge-特殊密碼鎖

描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。 然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的一

PAT DFSBFSDijkstra

遇到 最短路 短路徑 結果 時間 清晰 直接 今天 我們 為什麽要分類刷題: 因為刷?道算法題需要花?兩個?時甚?半天,平時我們還要上課做別的事情,你在?段時間內刷算法如果只按照順序,可能今天遇到了?道最短路徑的題?,弄了半天好不容易看懂了別?的代碼,以為??懂了,結果?

【IP分析】合並信concat拆分總線slice

信號 com images logs 合並 這一 -1 image mage 一般都是把幾個零散的中斷信號合並成bus,連到系統中斷總線上。 比如出個GPIO[31:0]來控制bram的幾個控制信號,分配如下: GPIO[24] - clk (可以直接指定[24]這

FreeRTOS 二值信互斥信

形象 iii 說明 reat 互斥 機制 容易 del 情況 本章節講解 FreeRTOS 任務間的同步和資源共享機制,二值信號量。 二值信號量是計數信號量的一種特殊形式,即共享資源為 1 的情況。 FreeRTOS 分別提供了二值信號量和計數信號量,其中二值信號量可以理解

不用線程池使用Semaphore信量同樣也可以控制Thread多線程的並行數量。

for release map new dst sta 信號量 code tar static Semaphore sem = new Semaphore(100, 100); for (int i = 0; i <1000; i++)

唯一序列生成自測支持高並發不支持集群

n) 發生 for ase 數字 led efi date() trac 序列號組成:前綴 + 日期 + 尾數 比如:ZC20140806000001 總共兩個組成:一個枚舉類。一個靜態生成器。另外須要設計自己主動任務每日淩晨或其它時間重置一次