兩個for循環能處理哪些問題?
本人剛學c語言,
按我理解,本質上,兩個嵌套 for 循環可把兩個集合 生成 笛卡兒積(Cartesian product) 。
例如,撲克牌有 4 個花色,每花色 13 張,列印它們的組合。
#include &
int main() {
const char* A[] = { "??", "??", "??", "??" };
const char* B[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
for (int i = 0; i &< 4; i++) {
for (int j = 0; j &< 13; j++)
printf("%s%s ", A[i], B[j]);
puts("");
}
}
輸出:
??A ??2 ??3 ??4 ??5 ??6 ??7 ??8 ??9 ??10 ??J ??Q ??K
??A ??2 ??3 ??4 ??5 ??6 ??7 ??8 ??9 ??10 ??J ??Q ??K
??A ??2 ??3 ??4 ??5 ??6 ??7 ??8 ??9 ??10 ??J ??Q ??K
??A ??2 ??3 ??4 ??5 ??6 ??7 ??8 ??9 ??10 ??J ??Q ??K
交換兩個 for 可以改變生成的次序:
#include &
int main() {
const char* A[] = { "??", "??", "??", "??" };
const char* B[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
for (int j = 0; j &< 13; j++) {
for (int i = 0; i &< 4; i++)
printf("%s%s ", A[i], B[j]);
puts("");
}
}
輸出:
??A ??A ??A ??A
??2 ??2 ??2 ??2
??3 ??3 ??3 ??3
??4 ??4 ??4 ??4
??5 ??5 ??5 ??5
??6 ??6 ??6 ??6
??7 ??7 ??7 ??7
??8 ??8 ??8 ??8
??9 ??9 ??9 ??9
??10 ??10 ??10 ??10
??J ??J ??J ??J
??Q ??Q ??Q ??Q
??K ??K ??K ??K
3 個嵌套 for 循環等價於 ,如此類推。
足夠做計算機動畫了。
先從字元畫做起:
int w=10;
int h=10;
char text[width][height] = {
" * ",
" *** ",
....
}
bool drawText(int col, int row, text)
{
//兩個for循環,以col/row決定起始值,col+width/row+height為終值,把text定義的圖形畫到指定位置
//注意判斷是否超過行列最大值,超過則返回false,以避免把圖形畫到屏幕外
}
然後再搞一個循環,讀取鍵盤輸入(WSAD之類),從而增減傳給drawText的col/row值——現在你就能用鍵盤輸入控制屏幕上的字元畫移動了。
提高1:用多幅字元畫切換,在屏幕播放動畫。
提高2:嘗試找資料切換到圖形模式,通過直接畫點來顯示真正的圖片
提高3:找資料想辦法改善程序性能,避免顯示動畫時屏幕閃爍不止
提高4:想想淡入淡出之類效果怎麼做,給你的動畫加一些特技
如果有棧的話,基本上基礎邏輯都能做出來吧,你可以用棧模擬函數調用,於是就有了函數和遞歸,然後就無所不能了吧。。。
可以列印十遍這句話!
以列印十遍這句話!
列印十遍這句話!
印十遍這句話!
十遍這句話!
遍這句話!
這句話!
句話!
話!
!
按我理解,不帶for循環的C是圖靈完備的。
帶for循環的C也是圖靈完備的。也就是說你可以解決C語言能解決的所有問題。當然顯然樓主不是要問這個。那Milo巨巨的答案是正解。
二維形式的數據, 可以用兩個循環來遍歷或構造.
沒有什麼是兩個for循環解決不了的,如果有,就在外面再套兩個 (可恥的跑了)
兩層for循環...沒說不能遞歸以及其他的函數調用...我猜可以上天吧
本人競賽用的廣搜板子,代碼里多用了一個if,當然可以不用,用上三目運算符可以用比較醜陋的方法替代。
競賽代碼風格醜陋,諒解。
int qu[N], qh, qt, dis[N];
int bfs(int st, int ed) {
for (dis[qu[qh = qt = 0] = st] = 0; qh &<= qt; ++qh)
for (int u = qu[qh], e = adj[u], v = gto[e]; ~e; v = gto[e = gnxt[e]])
if (v != st !dis[v]) dis[qu[++qt] = v] = dis[u] + 1;
return dis[ed];
}
大概介紹一下幾個莫名奇妙的數組名,用的是鏈式前向星存的圖。
adj: adjacency list,鄰接表,存的是鏈表頭節點下標,一個節點是一條有向邊,保存指向的vertex編號。
gnxt[e]: 鄰接表節點e的下一個節點下標。
這裡adj和gnxt中保存-1表示鏈表中當前節點沒有後繼,因此用~e判斷終點。
gto[e]: 鄰接表節點e所在edge指向的vertex編號。
第一個for遍歷隊列,第二個for遍歷隊列頭的相鄰邊。
然後有廣搜自然有Bellman Ford (SPFA)……不過多用了一堆操作,加了循環隊列。用上三目運算符也可以用非常醜陋的方法替代。
int qu[N], qh, qt, dis[N], inq[N];
int bellman_ford(int st, int ed) {
memset(dis, 0x7f, sizeof dis); dis[st] = 0;
for (inq[qu[qh = qt = 0] = st] = 1; qh &<= qt; inq[qu[qh++ % N]] = 0)
for (int u = qu[qh % N], e = adj[u], v = gto[e]; ~e; v = gto[e = gnxt[e]])
if (dis[v] &> dis[u] + gw[e]) {
dis[v] = dis[u] + gw[e];
if (!inq[v])
inq[qu[++qt % N] = v] = 1;
}
return dis[ed];
}
這裡鄰接表多保存了一個邊權gw,指的是邊長度。
剛剛手打的,如果出錯了請告知。
兩個for循環
可以便利一個二維列表
可以對一張圖片加個濾鏡
可以給這張圖片重置大小
可以把這張圖片的每個像素點變成一個字元
可以再把這些字元按行列印出來
就醬
這個圖看著不是很好看,再來張小的
你可以把代碼複雜度變成平方(
如果你喜歡,可以用goto徹底代替for循環。
任何二維離散空間的數值計算
雙傅里葉積分算PWM調製頻譜
總而言之本質上的二重積分都可以for(universe : universes){
for(particle : universe ) { if(particle.Observed()){ particle.show(); }}
universe.tick();}話說知乎為啥自動吃掉了我的空格。兩個for循環可以表示二維信息啊,一個就表示線性
現在的系統最外層也只是一個循環,你兩個循環真的可以上天了吧
你以後筆試或者面試的大部分問題都可以用兩層循環解決,包括圖論和動規問題。如果兩層都解決不了就要想想是不是思路有問題了。
排序,對數組的冒泡排序
兩個並列的 for 循環
for(int i = start1; i &< end1; i++) {
// iteration body 1
// ...
}
for(int i = start2; i &< end2; i++) {
// iteration body 2
// ...
}
等價於一個 for 循環
bool firstIter = true;
for(int i = start1; (firstIter) || (!fistIter i &< end2); i++) {
if(firstIter) {
if(i &<= end1) {
// iteration body 1
// ...
}
else {
firstIter = false;
i = start2;
continue;
}
}
else {
// iteration body 2
// ...
}
}
那麼兩個嵌套的 for 循環(留做練習?)
綜上,一個 for 循環好像和兩個沒啥區別。
推薦閱讀:
※作為程序員的你(或者即將成為程序員)何時意識到數學的重要性?
※Rust中常量為什麼用let不用const,變數用let mut不用var?
※c++現在有哪些GUI庫可以用?
※計算機系學生的你,有哪些課程覺得自己沒有學明白?
※為什麼函數能遞歸調用自己?