一、气球排列问题
题目描述
有 n 种气球,每种数量无限。将它们排成一排共 m 个,要求相邻气球颜色不同。求方案数对 10^9+7 取模的结果。
解题思路
这是一个典型的乘法原理应用题。 摆放第一个气球时,有 n 种选择。 从第二个气球开始,每个位置都不能与前一个相同,因此每个位置都有 n-1 种选择。 总方案数为 n * (n-1)^(m-1)。 由于结果可能很大,计算过程中需随时取模防止溢出。
代码实现
注意数据范围,运算过程中及时取模。
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
long long ret = n;
for (int i = 1; i < m; i++) {
ret *= (n - 1);
ret %= 1000000007;
}
cout << ret << endl;
return 0;
}
二、走迷宫最短路径
题目描述
给定 n*m 的二维字符数组,* 为障碍,. 为空。给定起点 (x1, y1) 和终点 (x2, y2),每次可上下左右移动一格,求最少移动次数。
解题思路
这是标准的广度优先搜索(BFS)应用场景。
使用队列存储待访问的位置,记录到达每个点的最短步数。
需要一个 vis 数组记录是否访问过以及步数,避免重复遍历。
当第一次到达终点时,当前的步数即为最短路径。
注意题目下标通常从 1 开始,需处理边界条件。
代码实现
#include <iostream>
#include <queue>
using namespace std;
const int N = 1001;
char arr[N][N];
int vis[N][N];
int n, m;
int dx[] = {-1, , , };
dy[] = {, , , };
x1, x2, y1, y2;
{
(arr[x2][y2] == ) ;
( i = ; i <= n; i++) {
( j = ; j <= m; j++) {
vis[i][j] = ;
}
}
queue<pair<, >> pq;
pq.({x1, y1});
vis[x1][y1] = ;
(!pq.()) {
a = pq.().first;
b = pq.().second;
pq.();
( i = ; i < ; i++) {
x = a + dx[i];
y = b + dy[i];
(x > && x <= n && y > && y <= m && arr[x][y] == && vis[x][y] == ) {
vis[x][y] = vis[a][b] + ;
(x == x2 && y == y2) vis[x][y];
pq.({x, y});
}
}
}
vis[x2][y2];
}
{
cin >> n >> m;
cin >> x1 >> y1 >> x2 >> y2;
( i = ; i <= n; i++) {
( j = ; j <= m; j++) {
cin >> arr[i][j];
}
}
cout << () << endl;
;
}


