1. 程式人生 > >計蒜客 矩陣變換 (bfs+set)

計蒜客 矩陣變換 (bfs+set)

題目:


題目大意:

讓你求解出原字串怎樣通過已有的規則變化為目標串,輸出所用到的規則。

題目思路:

這樣的話,我們先將所謂的規則寫成相應的函式,然後利用bfs進行字串的變換,知道字串變為目標串結束,如果你不進行visit標記的話,那麼MLE,如果採用O(n)的方法來標記的話,肯定會超時,那麼就用set作為標記陣列,這樣就能得出相應的結果。

程式碼:

#include <bits/stdc++.h>
using namespace std;
string s;//最開始串
string as;//目標串
set<string>sset;
bool checkvisit(string s)
{
    if(sset.find(s)!=sset.end())return false;

    return true;
}
struct node
{
    string mys;
    string ans;
};

string ca(string s)
{
    string b;
    for(int i=s.size()-1;i>=4;i--)
        b.push_back(s[i]);
    for(int i=3;i>=0;i--)
        b.push_back(s[i]);

    return b;
}
string cb(string s)
{
    string b;
    b.push_back(s[3]);
    for(int i=0;i<3;i++) b.push_back(s[i]);
    for(int i=5;i<s.size();i++) b.push_back(s[i]);
    b.push_back(s[4]);

    return b;
}

string cc(string s)
{
    string b;
    int a[8]={1,7,2,4,5,3,6,8};
    for(int i=0;i<8;i++)
        b.push_back(s[a[i]-1]);

    return b;
}

void bfs()
{
    queue<node>Q;
    node start;
    start.mys=s;
    sset.insert(s);
    Q.push(start);
    while(!Q.empty()){
        node now=Q.front();Q.pop();
        if(now.mys==as){
            cout<<now.ans<<endl;
            break;
        }
        node next;
        string tmp;

        tmp=ca(now.mys);
        next.mys=tmp,next.ans=now.ans;
        if(checkvisit(next.mys)){
            next.ans.push_back('A');
            Q.push(next);
            sset.insert(next.mys);
        }

        tmp=cb(now.mys);
        next.mys=tmp,next.ans=now.ans;
        if(checkvisit(next.mys)){
            next.ans.push_back('B');
            Q.push(next);
            sset.insert(next.mys);
        }

        tmp=cc(now.mys);
        next.mys=tmp,next.ans=now.ans;
        if(checkvisit(next.mys)){
            next.ans.push_back('C');
            Q.push(next);
            sset.insert(next.mys);
        }
    }
}
int main()
{
    cin>>s>>as;
    bfs();
    return 0;
}


相關推薦

矩陣變換 bfs+set

題目: 題目大意: 讓你求解出原字串怎樣通過已有的規則變化為目標串,輸出所用到的規則。 題目思路: 這樣的話,我們先將所謂的規則寫成相應的函式,然後利用bfs進行字串的變換,知道字串變為目標串結束,如果你不進行visit標記的話,那麼MLE,如果採用O(n)的方法來標記的

網路交友map +set +並查集

這道題我為什麼寫題解, 就是因為我莫名其妙的就秒了。可能就是一個大水題吧 還有就是這道題用map+ set寫的真滴快! 題目:在網路社交的過程中,通過朋友,也能認識新的朋友。在某個朋友關係圖中,假定 A 和 B 是朋友,B 和 C 是朋友,那麼 A 和 C

--爬樓梯 動態規劃

tle nbsp vector main long 3.1 false n) 方法 假設你現在正在爬樓梯,樓梯有 nn 級。每次你只能爬 11 級或者 22 級,那麽你有多少種方法爬到樓梯的頂部? 輸入格式 第一行輸入一個整數 n(1\leq n \leq 50)n

:灌溉生成樹

https://nanti.jisuanke.com/t/34 到了旱季農業生產的灌溉就成了一個大問題。為了保證灌溉的順利,某縣政府決定投資為各個村之間建立灌溉管道。 輸入第1行包括一個整數N,表示某縣的村莊的數量。(3≤N≤100),第2行-結尾為一個N×N的矩陣,表示每個村莊之間的距

載入數字密題

小蒜把1-n這n個數字寫進記憶體,但是除了用二進位制格式寫的數字(只包含0,1的數字)都失敗了,現在他想知道有多少個數字載入成功了。 輸入格式 一個整數 n(1≤n≤10^9) 輸出格式 一個整數表示載入成功的數字個數 樣例輸入 10 樣例輸出 2 這道題思路

-Chessboard Dancing思維題

不要怕長題! 不要怕長題! 不要怕長題! 90%的長題都很簡單。 這道題其實仔細想一下拿個紙畫一下就可以了,感覺更多的是在考翻譯。 #include<iostream> #include<cstdio> #include<algorithm

16495 Truefriendfwt

ios public () eof .cn png pac log typedef #include <iostream> #include <cstring> #include <cstdio> using namespace st

16492 building二分線段樹/分塊

sin cst include sqrt ++ building scanf mat math 題解: 考慮用線段樹維護樓的最大值,然後這個問題就很簡單了。 每次可以向左二分出比x高的第一個樓a,同理也可以向右二分出另一個樓b,如果a,b都存在,答案就是b-a-1。 註意到

Mathematical CurseACM-ICPC 2018 焦作賽區網路預賽 BDP

A prince of the Science Continent was imprisoned in a castle because of his contempt for mathematics when he was young, and was entangled

Transport ShipACM-ICPC 2018 焦作賽區網路預賽 K多重揹包裝滿的方案數

There are NN different kinds of transport ships on the port. The i^{th}ith kind of ship can carry the weight of V[i]V[i] and the number of

Transport Ship 2018-ACM-ICPC-焦作-網路賽DP

There are NN different kinds of transport ships on the port. The i^{th}ith kind of ship can carry the weight of V[i]V[i] and the number of

矩陣反轉

題目描述 24.22% 1000ms 65536K 曉萌最近在做一個翻轉圖片的應用,你可能也知道,圖片其實是由一個個的點組成的。於是,曉萌想先做一個可以翻轉矩陣的程式,來解決他問題的核心部分。 輸入格式 輸入第一行包括由空格分開的整數 M,N,T(0 < N,

抄襲檢測 最長公共子串

#include<stdio.h> #include<algorithm> #include<cstring> #include<iostream> const int MAXN = 2e5+10; int r[MAX

矩陣旋轉

#include <iostream> #include <cstdio> using namespace std; int a[205][205]; int main() { int n,m; //n行m列 cin>>n>>m; for(i

--農場看守簡單的歐拉回路

蒜頭君最近做了農場看守,他每天晚上的工作就是巡視農場並且保證沒有人破壞農場。從穀倉出發去巡視,並且最終回到穀倉。 蒜頭君視力不太好,其他農場守衛只需要對農場的每一條連線不同場地的路走一遍就可以發現是不是有異常情況了。但是他很仔細和耐心,對農場的每一條連線不同場地的路需要走

()迷宮中的英雄(鄰接矩陣BFS)

500年前,Jesse是我國最卓越的劍客。他英俊瀟灑,而且機智過人^_^。 突然有一天,Jesse心愛的公主被魔王困在了一個巨大的迷宮中。Jesse聽說這個訊息已經是兩天以後了,他知道公主在迷宮中還能堅持T天,他急忙趕到迷宮,開始到處尋找公主的下落。 時間一點一點的過去,J

2018 藍橋杯省賽 B 組模擬賽 A. 結果填空:矩陣求和

【題目連結】:https://nanti.jisuanke.com/t/25084【題目描述】:給你一個 n×n 的矩陣,裡面填充 1到 n x n。例如當 n 等於 3 的時候,填充的矩陣如下。1    2    34    5    67    8    9現在我們把矩陣

15430 XOR QueriesTrie處理位運算問題

ron 二進制 進制 插入 我們 整數 容易 位置 xor 題意: 給出一個長度為n的數組C,回答m個形式為(L, R, A, B)的詢問, 含義為存在多少個不同的數組下標k屬於[L, R]滿足C[k] XOR A >= B(式中XOR為異或運算)。 T組測試數

騰訊課堂的物理實驗2017初賽第三場

text ram amp tex 方向 top names rip des A題 在騰訊課堂的物理課上,進行了一個有趣的物理實驗。 在一個長度為 LL 米的光滑軌道上,小車 A 在 00 時刻以 1\mathrm{m/s}1m/s 的速度從左端出發向右運動,小車 B 在

UCloud 的安全秘鑰 初賽第五場待解決

限制 一行 序列 0ms n) content mes 初賽 -o 20.7% 1200ms 262144K 每個 UCloud 用戶會構造一個由數字序列組成的秘鑰,用於對服務器進行各種操作。作為一家安全可信的雲計算平臺,秘鑰的安全性至關重要。因此,UCloud