題目描述:
下圖為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...