重疊的方框

2021-09-21 18:11:50 字數 1820 閱讀 6870

題目描述:

下圖為5

個放置在

9x8 的點陣中的方框圖:

若將他們按順序疊放起來

.則會有某些框的一部分蓋住了另外乙個框

,遮住一些部分

. 下圖是這

5個框疊放起來的圖形:

那麼這些方框從下至上疊放的順序是什麼呢

?答案是

: edabc.

你的任務是對於乙個給定的方框疊放以後的圖形

, 找出他們從下至上的疊放順序

.下面是一些規則

:(1).

方框的邊寬度為乙個字元

,邊長不少於

3個字元

;(2).

每個方框的

4條邊都有一部分可見

, 乙個角代表兩條邊

;(3).

方框用大寫字母了表示

, 沒有兩個方框用相同的字元來表示

.前兩行每行乙個數字,分別表示長、寬。

接下來為框疊起來的圖。沒有框的地方用

'.'表示。

輸出全部可能情況。

按字典順序排序。

9

8.ccc....

ecbcbb..

dcbcdb..

dccc.b..

d.b.abaa

d.bbbb.a

ddddad.a

e...aaaa

eeeeee..

copy
edabc
思路:首先因為每個字母矩形頂角都一定是有的,所以我們可以先求出左上和右下角兩個頂角。然後就可以確定下這個矩形的形狀了,然後沿著四條邊掃瞄一遍,如果有乙個字母c在當前字母k矩陣上面,那麼說明c一定是在k上面的,那麼肯定有在輸出順序中c要在k後面。

然後就是拓撲排序。用book[i][j]記錄有向邊,那麼很容易就變成乙個求所有拓撲序列的問題了。因為序列要從小到大字典序,而且要輸出全部的情況,所以我們考慮dfs即可。

**:

#includeusing namespace std;

int n, m;

char a[50][50];//儲存初始方陣

char ans[50];//記錄答案

int book[50][50];//記錄有向路徑

int in[50];//記錄c字元前面有幾個字元

int h[50];//記錄某個字母有沒有用到

int cnt;//記錄方陣中有幾個字母

void dfs(int cur)

else

}dfs(cur + 1);

in[i] = 0;//回溯

for (int j = 0; j < 26; j++)}}

}}}int main()

}for (int k = 0; k < 26; k++)//26個字母遍歷一遍}}

if (x1 == 50 || y1 == 50 || x2 == 0 || y2 == 0)//保持原樣說明沒有這個字母,直接到下乙個迴圈

h[k] = 1;//表示這個字母輸入過

cnt++;//輸入的總字母++

for (int i = x1; i <= x2; i++)}}

}}}dfs(0);

}

1091 線段的重疊 區間重疊

題目鏈結 思路 保證思路的有序性。如果拿出來每一條邊與其他邊進行比較,那麼一定可以得出答案。但是一條邊 l,r 只能和與它有交集的邊產生可能。那麼進行排序,按照左端點,在某條邊的l大於當前選擇的邊的r時break。能否在o n 的演算法處理呢?也就是說,列舉的區間是有選擇性的。假設當前選定的區間是a...

C C OpenCV方框濾波

方框濾波boxfilter 函式 void boxfilter inputarray src,outputarray dst,int depth,size ksize,point anchor point 1,1 bool normalize true,int bordertype border d...

線段的重疊

x軸上有n條線段,每條線段包括1個起點和終點。線段的重疊是這樣來算的,10201020和12251225的重疊部分為12201220。給出n條線段的起點和終點,從中選出2條線段,這兩條線段的重疊部分是最長的。輸出這個最長的距離。如果沒有重疊,輸出0。input第1行 線段的數量n 2 n 50000...