演算法入門經典

2021-08-03 10:43:37 字數 2740 閱讀 9111

有n盞燈,編號為1~n。第1個人把所有燈開啟,第2個人按下所有編號為2 的倍數的開關(這些燈將被關掉),第3個人按下所有編號為3的倍數的開關(其中關掉的燈 將被開啟,開著的燈將被關閉),依此類推。一共有k個人,問最後有哪些燈開著?輸 入n和k,輸出開著的燈的編號。k≤n≤1000。

樣例輸入:

7 3樣例輸出:

1 5 6 7

【分析】

用a[1],a[2],…,a[n]表示編號為1,2,3,…,n的燈是否開著。模擬這些操作即可。

**如下:

#include#include#define maxn 1010

int a[maxn];

int main()

printf("\n");

return 0;

}

注意:「memset(a,0,sizeof(a))」的作用是把陣列a清零,它也在string.h中定義。雖然也能 用for迴圈完成相同的任務,但是用memset又方便又快捷。另乙個技巧在輸出:為了避免輸出 多餘空格,設定了乙個標誌變數first,可以表示當前要輸出的變數是否為第乙個。第乙個變 量前不應有空格,但其他變數都有。

在n×n方陣裡填入1,2,…,n×n,要求填成蛇形。例如,n=4時方陣為:

10 11 12 1 

9  16 13 2 

8 15  14 3

7  6   5   4

上面的方陣中,多餘的空格只是為了便於觀察規律,不必嚴格輸出。n≤8

【分析】

模擬數學中的矩陣,可以用乙個二維陣列來儲存題目中的方陣。只需宣告乙個「int a[maxn][maxn]」,就可以獲得乙個大小為maxn×maxn的方陣。在宣告時,二維的大小不必相 同,因此也可以宣告int a[30][50]這樣的陣列,第一維下標範圍是0,1, 2,…,29,第二維下標範 圍是0,1,2,…,49。用「int a[maxn][maxm]」生成乙個整型的二維陣列,其中maxn和maxm 不必相等。這個陣列共有maxn×maxm個元素,分別為a[0][0], a[0][1],…, a[0][maxm-1], a[1][0],a[1][1],…,a[1][maxm-1],…,a[maxn-1][0],a[maxn-1][1],…, a[maxn-1] [maxm 1]。

從1開始依次填寫。設「筆」的座標為(x,y),則一開始x=0,y=n-1,即第0行,第n-1列 (行列的範圍是0~n-1,沒有第n列)。「筆」的移動軌跡是:下,下,下,左,左,左, 上,上,上,右,右,下,下,左,上。總之,先是下,到不能填為止,然後是左,接著是 上,最後是右。「不能填」是指再走就出界(例如4→5),或者再走就要走到以前填過的格仔 (例如12→13)。如果把所有格仔初始化為0,就能很方便地加以判斷。

**如下:

#include#include#define maxn 20 

int a[maxn][maxn]; 

int main() 

for(x = 0; x < n; x++)  

return 0;

}

注意:這段程式充分利用了c語言簡潔的優勢。首先,賦值x=0和y=n-1後馬上要把它們 作為數 組a的下標,因此可以合併完成;tot和a[0][n-1]都要賦值1,也可以合併完成。這樣,就用一 條語句完成了多件事情,而且並沒有犧牲程式的可讀性——這段**的含義顯而易見。可以利用c語言簡潔的語法,但前提是保持**的可讀性。4條while語句有些難懂,不過十分相似,因此只需介紹其中的第一條:不斷向下走, 並且填數。原則是:先判斷,再移動,而不是走一步以後發現越界了再退回來。這 樣,則需要進行「預判」,即是否越界,以及如果繼續往下走會不會到達乙個已經填過的格 子。越界只需判斷x+1

找出所有形如abc*de(三位數乘以兩位數)的算式,使得在完整的豎式中, 所有數字都屬於乙個特定的數字集合。輸入數字集合(相鄰數字之間沒有空格),輸出所有 豎式。每個豎式前應有編號,之後應有乙個空行。最後輸出解的總數。具體格式見樣例輸出 (為了便於觀察,豎式中的空格改用小數點顯示,但所寫程式中應該輸出空格,而非小數 點)。

樣例輸入:

2357

樣例輸出:

<1>

..775

x..33

----

.2325

2325.

----

25575

the number of solutions = 1

【分析】

本題的思路應該是很清晰的:嘗試所有的abc和de,判斷是否滿足條件。我們可以寫出 整個程式的偽**:

char s[20]; 

int count = 0;

scanf("%s", s);

for(int abc = 111; abc <= 999; abc++)

for(int de = 11; de <= 99; de++)

if("abc*de"是個合法的豎式)

printf("the number of solutions = %d\n", count);

**實現

#include#includeint main()

}printf("the number of solutions=%d\n",count);

return 0;

}

持續更新

演算法競賽入門經典 C 入門

include 提供輸入輸出流 include 提供常用演算法 using namespace std const int maxn 100 10 int a maxn int main return0 宣告陣列時,陣列大小可以用const宣告的常數。在c 中,這樣的寫法更加推薦。include i...

硬幣問題 《演算法入門經典》

分析 典型的固定起始點的dag最長路最短路問題。起點為s,終點為0,只是注意一些細節。1 輸出答案。2 是否能走到0 include include include define maxn 100009 define inf 0x3f3f3f3f using namespace std int v ...

演算法入門經典 開燈問題

演算法入門經典 開燈問題 前言 一直很羨慕那些善於寫演算法的同學,感覺他們真的很聰明,不想我這麼笨,一思考演算法就頭疼。罷了,從最簡單的開始吧,加油。問題 有n盞燈,編號為1 n,第1個人把所有燈開啟,第2個人按下所有編號為2的倍數的開關 這些燈將被關掉 第3個人按下所有編號為3的倍數的開關 其中關...