第一题:电报破解
其实就是字符串模拟,给一个字符串(含空格),以及反转的长度。最终将字符串破解。
#include <iostream>
#include <vector>
#include <stack>
#include <string>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <stdlib.h>
#include <map>
using namespace std;
int main()
{
string str;
int n;
scanf("%d", &n);
// 输入一行数据
getchar();
getline(cin, str);
int length = str.size();
// 如果n>=length,直接输出
if(n >= length){
for(int i = length - 1; i >= 0; i--)
printf("%c", str[i]);
printf("
");
}
else{
// 之前的
int before = length / n;
int i = 0;
for(int i = 1; i <= before; i++){
for(int j = i * n - 1; j >= (i - 1) * n; j--)
printf("%c", str[j]);
}
int after = length % n;
if(after != 0){
for(int i = length - 1; i >= length - after; i--)
printf("%c", str[i]);
}
printf("
");
}
return 0;
}
第二题:村庄建桥
给n
个村庄,m
座桥,m座桥的建桥成本w
,并给出成本限制k
,判断能否建桥使得村庄互通。这个题理解了其实就很简单,就是一个判断图是否连通,简单DFS就完事儿了。
#include <iostream>
#include <vector>
#include <stack>
#include <string>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <stdlib.h>
#include <map>
using namespace std;
#define MAXVEX 100
#define INFINITYNUM 65535
// 邻接矩阵
struct GraphAdiMatix{
int numVertexes;
int numEdges;
// 顶点表
int vexs[MAXVEX];
// 邻接矩阵
int arc[MAXVEX][MAXVEX];
};
void DFSMatix(GraphAdiMatix G, bool visit[], int i){
visit[i] = true;
for(int j = 0; j < G.numVertexes; j++){
if(G.arc[i][j] != INFINITYNUM && !visit[j]){
DFSMatix(G, visit, j);
}
}
}
// (Depth First Search, DFS)深度优先遍历邻接矩阵(其实就像二叉树的前序遍历)
int DFSTraveseMatix(GraphAdiMatix G){
int count = 0;
bool visit[MAXVEX];
memset(visit, false, sizeof(visit));
for(int i = 0; i < G.numVertexes; i++){
if(!visit[i]){
DFSMatix(G, visit, i);
// 如果是连通图那么只会一次
count++;
}
}
return count;
}
int main(int argc, char* argv[])
{
int T;
scanf("%d", &T);
while(T--){
GraphAdiMatix G;
// 输入顶点数和边数
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
G.numVertexes = n;
G.numEdges = m;
// 顶点初始化
for(int i = 0; i < G.numVertexes; i++){
G.vexs[i] = i;
}
// 邻接矩阵初始化
for(int i = 0; i < G.numVertexes; i++){
for(int j = 0; j < G.numVertexes; j++)
G.arc[i][j] = INFINITYNUM;
}
while(m--){
int x, y, w;
scanf("%d %d %d", &x, &y, &w);
if(w <= k)
G.arc[x - 1][y - 1] = G.arc[y - 1][x - 1] = w;
}
int count = DFSTraveseMatix(G);
cout<<count<<endl;
if(count == 1)
printf("Yes
");
else
printf("No
");
}
return 0;
}