- 孔子丹 的博客
7.11
- @ 2024-7-11 19:51:23
T1 小田的四则运算
思路:用第一个数和第二个数相加和相乘作比较,存在sum里,然后和第三个数作比较,得出最够结果;
输入 #1
1 2 3
输出 #1
9
因(1+2)*3=9,最大;
输入 #2
2 2 3
输出 #21
12
因2 * 2 * 3=12,最大;
T5 小W走迷宫
思路:这道题要用搜索做,深搜和广搜都可以;
输入数据 1
6 6
.*.#..
.#....
..##..
......
.#....
....@.
用s标出路线
6 6 .* s#. . .#s s s . . .##s . . . . . s . .#. . s . .. . .@. 一共要8步; DFS写法 代码:
void dfs(int x,int y,int d){
dis[x][y]=d;
for(int i=0;i<=3;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>0&&ny>0&&nx<=m&&ny<=n&&mp[nx][ny]=='.'&&d+1<dis[nx][ny]){
dfs(nx,ny,d+1);
}
}
}
T6 小W去旅游
思路:图论; 模版: 1,Floyd求最短路
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(d[i][j]>d[i][k]+d[k][j])
d[i][j]=d[i][k]+d[k][j];
2,Dijkstra求最短路
#include <bits/stdc++.h>
using namespace std;
int arr[1005][1005];//邻接矩阵存储每条边
int dist[1005];//i的最短路长度
bool v[1005];//标记数组
int n, m, ans;
int dijkstra() {
memset(dist, 0x3f, sizeof(dist));//dist数组初始化最大
memset(v, 0, sizeof(v));//节点标记
dist[1] = 0; //节点1
for (int i = 1; i < n; i++) { //重复进行n-1次 ,还有n-1个点需要标记
int x = -1; //寻找未标记中 dist值最小的
for (int j = 1 ; j <= n ; j++) {
if (!v[j] && (x == -1 || dist[j] < dist[x])) x = j; //未标记且最小
}
v[x] = 1; //找到后标记该节点
for (int y = 1; y <= n; y++) { //用当前最小值x更新其他节点
dist[y] = min(dist[y], dist[x] + arr[x][y]); //更新最短路
}
}
if (dist[n] == 0x3f3f3f3f) return -1; //未更新输出-1
return dist[n];
}
int main() {
scanf("%d%d", &n, &m);
//构建邻接矩阵
memset(arr, 0x3f, sizeof(arr)); //极大
for (int i = 1; i <= n; i++) arr[i][i] = 0;
for (int i = 1; i <= m; i++) { //存边
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
arr[x][y] = min(arr[x][y], z); //有重边只保留最小边
}
ans = dijkstra();
printf("%d\n", ans);
return 0;
}