int a[110][110], b[110][110], c[110][110]; int n, m; cin >> n >> m; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) cin >> a[i][j]; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) cin >> b[i][j]; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) c[i][j] = a[i][j] + b[i][j];
蛇形填数(经典练习)
// 从 (0,0) 开始向右,遇到边界或已填数则转向(下、左、上)循环 int a[20][20] = {0}; int n; cin >> n; int x = 0, y = 0, tot = 1; a[x][y] = tot++; while (tot <= n * n) { while (y + 1 < n && !a[x][y+1]) a[x][++y] = tot++; while (x + 1 < n && !a[x+1][y]) a[++x][y] = tot++; while (y - 1 >= 0 && !a[x][y-1]) a[x][--y] = tot++; while (x - 1 >= 0 && !a[x-1][y]) a[--x][y] = tot++; }
1.6 多维数组简介
三维数组可看作“立方体”:int a[10][10][10];,访问时使用三个下标。一般 OI 中不超过三维。
intmain(){ int x = 3, y = 5; int z = add(x, y); cout << z << endl; // 8 return0; }
4.2 函数声明
如果函数的定义写在调用之后,需要先声明。
intadd(int a, int b); // 声明
intmain(){ cout << add(2,3) << endl; }
intadd(int a, int b){ // 定义 return a + b; }
4.3 参数传递
值传递:形参是实参的拷贝,函数内修改不影响实参。
引用传递:形参是实参的别名,修改会影响实参(使用 &)。
voidswap1(int a, int b){ // 值传递,无效 int t = a; a = b; b = t; } voidswap2(int &a, int &b){ // 引用传递,有效 int t = a; a = b; b = t; } intmain(){ int x=1, y=2; swap1(x,y); // x,y 不变 swap2(x,y); // x=2, y=1 }
4.4 默认参数
voidprint(int n, int base = 10){ // base 默认10 // ... } print(100); // base=10 print(100, 8); // base=8
4.5 函数重载
函数名相同,参数列表不同(类型、个数、顺序)。
intmax(int a, int b){ return a>b?a:b; } doublemax(double a, double b){ return a>b?a:b; }
4.6 递归
函数调用自身。必须有一个终止条件,否则无限递归。
阶乘示例:
intfact(int n){ if (n == 0 || n == 1) return1; return n * fact(n - 1); }
斐波那契数列:
intfib(int n){ if (n == 1 || n == 2) return1; returnfib(n-1) + fib(n-2); }
int bucket[10010] = {0}; int n, x; cin >> n; for (int i = 0; i < n; i++) { cin >> x; bucket[x]++; } for (int i = 0; i <= 10000; i++) { for (int j = 0; j < bucket[i]; j++) { cout << i << " "; } }
6.2 冒泡排序
相邻元素比较,将大的向后“冒泡”,每轮确定一个最大元素。
voidbubbleSort(int a[], int n){ for (int i = 0; i < n-1; i++) { for (int j = 0; j < n-1-i; j++) { if (a[j] > a[j+1]) { swap(a[j], a[j+1]); } } } }
6.3 选择排序
每轮选择剩余元素中的最小值,放到已排序末尾。
voidselectionSort(int a[], int n){ for (int i = 0; i < n-1; i++) { int minIdx = i; for (int j = i+1; j < n; j++) { if (a[j] < a[minIdx]) minIdx = j; } swap(a[i], a[minIdx]); } }
6.4 插入排序
将当前元素插入到已排序序列的合适位置。
voidinsertionSort(int a[], int n){ for (int i = 1; i < n; i++) { int key = a[i]; int j = i-1; while (j >= 0 && a[j] > key) { a[j+1] = a[j]; j--; } a[j+1] = key; } }
6.5 使用 STL sort(推荐)
#include <algorithm> 中的 sort 函数,效率高且简单。
int a[100]; int n; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; sort(a, a + n); // 升序 sort(a, a + n, greater<int>()); // 降序
// 自定义排序规则(如按成绩降序,同成绩按姓名升序) structStudent { string name; int score; }; boolcmp(const Student &a, const Student &b){ if (a.score != b.score) return a.score > b.score; return a.name < b.name; } sort(stu, stu + n, cmp);
#include<cstdio> intmain(){ freopen("in.txt", "r", stdin); // 从文件读入 freopen("out.txt", "w", stdout); // 输出到文件 // 正常的 cin/cout 或 scanf/printf int a, b; cin >> a >> b; cout << a + b << endl; fclose(stdin); fclose(stdout); // 可省略 return0; }
8.2 使用 fstream
#include<fstream> usingnamespace std; ifstream fin("in.txt"); ofstream fout("out.txt"); int a, b; fin >> a >> b; fout << a + b << endl; fin.close(); fout.close();