腾讯---画家小Q
騰訊—畫家小Q
文章目錄
- 騰訊---畫家小Q
- 一、題目描述
- 二、分析
- 三、代碼
一、題目描述
畫家小Q又開始他的藝術(shù)創(chuàng)作。小Q拿出了一塊有NxM像素格的畫板, 畫板初始狀態(tài)是空白的,用'X'表示。
小Q有他獨特的繪畫技巧,每次小Q會選擇一條斜線, 如果斜線的方向形如'/',即斜率為1,小Q會選擇這條斜線中的一段格子,都涂畫為藍色,用'B'表示;
如果對角線的方向形如'\',即斜率為-1,小Q會選擇這條斜線中的一段格子,都涂畫為黃色,用'Y'表示。
如果一個格子既被藍色涂畫過又被黃色涂畫過,那么這個格子就會變成綠色,用’G’表示。
小Q已經(jīng)有想畫出的作品的樣子, 請你幫他計算一下他最少需要多少次操作完成這幅畫。
輸入描述:
每個輸入包含一個測試用例。 每個測試用例的第一行包含兩個正整數(shù)N和M(1 <= N, M <= 50), 表示畫板的長寬。 接下來的N行包含N個長度為M的字符串, 其中包含字符'B','Y','G','X',分別表示藍色 ,黃色,綠色,空白。整個表示小Q要完成的作品。輸出描述:
輸出一個正整數(shù), 表示小Q最少需要多少次操作完成繪畫。輸入例子1:
4 4 YXXB XYGX XBYY BXXY輸出例子1:
3例子說明1:
XXXX XXXX XXXX XXXX -> YXXX XYXX XXYX XXXY -> YXXB XYBX XBYX BXXY -> YXXB XYGX XBYY BXXY二、分析
這道題很簡單,千萬不要被題給嚇住了
- 這道題給了著色的方法和目標的圖案,我們首先肯定會想到把一個空白的畫板(全為‘X’)經(jīng)過n次涂色,轉(zhuǎn)變?yōu)槟繕藞D案,如果你這樣想,你就入坑了,因為你根本不知道每次涂多少個塊(需要遍歷計算),這樣就非常麻煩
- 所以需要轉(zhuǎn)變思想,既然畫板初始值全為‘X’,目標圖案已經(jīng)給你了,那么我們只需要計算從目標圖案轉(zhuǎn)變?yōu)榭瞻桩嫲?#xff08;全為‘X’)最少的次數(shù)即可。
- 我們怎么把目標圖案轉(zhuǎn)變?yōu)榭瞻桩嫲?#xff08;全為‘X’)呢?
- 轉(zhuǎn)換的方法和涂色方法完全相反即可:
1.從(0,0)位置開始遍歷
2.如果遍歷到(i,j)位置為B——>則以該點繼續(xù)向左下方(i+1,j-1)和右上方(i-1,j+1)遍歷時,遇到將B置為X,遇到G置為(消除B)置為Y
3.如果遍歷到(i,j)位置為Y——>則以該點繼續(xù)向左上方(i-1,j-1)和右下方(i+1,j+1)遍歷時,遇到將Y置為X,遇到G置為(消除Y)置為B
count++;4.如果遍歷到(i,j)位置為G——>則分別執(zhí)行2,3
三、代碼
#include <iostream> #include <vector> using namespace std;//用戶輸入的目標圖案 vector<vector<char>> str; //行列 int n,m;//遇到Y(jié)的處理 void dfs_Y(int x,int y) {//判斷下標是否越界并且是字符Y或Gif(x >= 0 && x < n && y >= 0 && y < m && (str[x][y] == 'Y' || str[x][y] == 'G')){if(str[x][y] == 'G')str[x][y] = 'B';elsestr[x][y] = 'X';//往左上和右下遞歸判斷dfs_Y(x - 1,y - 1);dfs_Y(x + 1,y + 1);}return ; }//遇到字符B的處理 void dfs_B(int x,int y) {//判斷下標是否越界并且是B或者G字符if(x >= 0 && x < n && y >= 0 && y < m && (str[x][y] == 'B' || str[x][y] == 'G')){if(str[x][y] == 'G')str[x][y] = 'Y';elsestr[x][y] = 'X';//遞歸往右上和左下判斷dfs_B(x + 1,y - 1);dfs_B(x - 1,y + 1);}return ; }int main() {int cnt=0;cin>>n>>m;str = vector<vector<char>>(n,vector<char>(m));for(int i = 0;i < n;i++){for(int j = 0;j < m;j++){cin>>str[i][j];}}//循環(huán)遍歷目標圖案for(int i = 0;i < n;i++){for(int j = 0;j < m;j++){if(str[i][j] == 'Y'){dfs_Y(i,j);cnt++;}else if(str[i][j] == 'B'){dfs_B(i,j);cnt++;}else if(str[i][j] == 'G'){dfs_Y(i,j);str[i][j]='B';dfs_B(i,j);cnt += 2;}}}cout<<cnt<<endl;return 0; }總結(jié)
- 上一篇: 腾讯----小Q的歌单
- 下一篇: 腾讯---编码