又到了寫演算法作業的時間了,這週給的題還是有水準的。(可能是因為我沒用函式的關係,寫了好久)話不多說,上題。
其實就是輸出集合的所有子集,加上逆序
讓我們冷靜的思考一下,這道題想要我們幹什麼,首先是要逆序,再就是找子串。好,逆序不是什麼難事,那麼我們來思考一下找有序子串。找有序子串,我們一般會一類一類找。打個比方
栗子:字串:abcde
1、先找最長的abcde
2、找第二長的abcd bcde
……5、找最短的 a b c d e
以此類推。
字串尋找思路有了,那麼想想怎麼輸出子串把。很顯然,我們有i類,每一類有j個字串,每個子串長度為k;一看就有三個迴圈。那怎麼控制控制變數呢?對於這種問題列個**是最好的解決方案.
下面->指向的方向
次數\ 迴圈變數
i
j(範圍)
k (範圍)
1
0
0->1
[0,3]abcd
2
1
0->2
[0,2]abc
[1,3]bcd
3
2
0->3
[0.1]ab
[1,2]bc
[2,3]cd
4
3
0->4
[0,0]a
[1,1]b
[2,2]c
[3,3]d
第一遍掃瞄過去 我們會發現 j 的最大值等於 i+1,我們可以很快捷的寫出相應的語句。
for (int i = 0; i < len; i++)現在我麼們只剩下第三個迴圈了。讓我們再來看看**,很容易的我們又發現k的每一次迴圈範圍都是上下限同時後移1位。這也意味著,我們k的初始值和迴圈終止條件,再每次開啟新一輪迴圈時都會改變,而且步長為 1。我們再仔細化一下**}
次數\ 迴圈變數
i
j
j與k的關係
k
1
0
0->1
j = 0, k [0,3]
[0,3]abcd
2
1
0->2
j = 0, k[0,2]
j = 1, k[1,3]
[0,2]abc
[1,3]bcd
3
2
0->3
j = 0, k[0,1]
j = 1, k[1,2]
j = 2, k[2,3]
[0.1]ab
[1,2]bc
[2,3]cd
4
3
0->4
j = 0, k[0,0]j = 1, k[1,1]
j = 2, k[2,2]
j = 3, k[3,3]
[0,0]a
[1,1]b
[2,2]c
[3,3]d
這樣我就清晰的發現 j 和 k 的 值是同步的。好了,現在只剩下 k 的結條件了。咋一眼看過去沒什麼規律是吧。讓我們仔細觀察一下 k 的值,是不是每一組的第一次終止條件都不一樣。
從 3 -> 2 -> 1 -> 0. 每一類都減少1,即 i 上公升 1 而 k 每一組的第一次終止條件都減少 1.然而這個規律僅僅是第乙個結束條件.再根據剛剛的步長為1 的條件我就可以輕鬆的寫出 i, j, k之間的關係式,即
k < len - i + j
這樣我們就可以寫出核心**了
for (int i = 0; i < len; i++)}}逆序輸出就把第三個迴圈的結束與開始換一換就行
最後貼**
記得自己先試一試!!!
#include #includeo(2n^3)#include
#define maxsize 110
intmain()
printf(""
);
for (int k = len - i + j - 1; k >= j; k--)
printf("\n
");}
}return0;
}
2019-10-10
更新一下用庫函式的寫法
1/**庫函式演算法多艱,諸君共勉~~~2* @brief 字串以及逆序字串
3* @note strrevn函式只在gcc中可用linux和cb都是gcc的直譯器
4* @author 楊文蓁的小迷弟5*/
6 #include 7 #include 8 #include
9 #include 10
#define maxsize 101
1112
intmain()
1320/**
21* @brief 查詢最大子串
22* @note 非kmp
23* @param *original: 最短的輸入字串
24* @param arraystrsize: 字串陣列大小
25* @retval 字串長度
26* @author 楊文蓁的小迷弟
27*/
28void searchmax(char *original, int
arraystrsize)
2947
}48 }
下五子棋的bot 五子棋演算法
include include include include include include jsoncpp json.h c 編譯時預設包含此庫 define n 7 每個節點的分支數 以下為各棋型的識別碼 權重 define win 1 4000 define lose 2 4000 defi...
五子棋(vb演算法)
for i 1 to 11 for j 1 to 11 if map i,j a and map i 1,j 1 a and map i 2,j 2 a and map i 3,j 3 a and map i 4,j 4 a then gameover a exit function next j ...
五子棋演算法3
這裡設計和實現了乙個人機對下的五子棋程式,採用了博弈樹的方法,應用了剪枝和最大最小樹原理進行搜尋發現最好的下子位置。介紹五子棋程式的資料結構 評分規則 勝負判斷方法和搜尋演算法過程。一 相關的資料結構 關於盤面情況的表示,以鍊錶形式表示當前盤面的情況,目的是可以允許使用者進行悔棋 回退等操作。cli...