一、Y总视频进度
二、刷题
2.1 AcWing 845. 八数码
1. 问题描述
2. 问题分析
没理解,之后在消化
3. 问题解决
#include <iostream>
#include <algorithm>
#include <queue>
#include <unordered_map>
using namespace std;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int bfs(string state)
{
string end = "12345678x";
queue<string> q;
unordered_map<string, int> d;
q.push(state);
d[state] = 0;
while(!q.empty())
{
string t = q.front();
q.pop();
int distance = d[t];
if(t == end) return distance;
// 状态转移
int k = t.find('x');
int x = k/3, y = k%3;
for(int i = 0; i < 4; i++)
{
int a = x + dx[i], b = y + dy[i];
if(a >= 0 && a < 3 && b >= 0 && b < 3)
{
swap(t[k], t[a*3 + b]);
if(!d.count(t))
{
d[t] = distance + 1;
q.push(t);
}
swap(t[k], t[a*3 + b]);
}
}
}
return -1;
}
int main()
{
char s[2];
string state;
for(int i = 0; i < 9; i++)
{
scanf("%s", s);
state += *s;
}
printf("%d\n", bfs(state));
return 0;
}
2.2 AcWing 846. 树的重心
1. 问题描述
2. 问题分析
emm…
3. 问题解决
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010, M = N * 2;
int n;
int h[N], e[M], ne[M], idx;
int ans = N;
bool st[N];
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
int dfs(int u)
{
st[u] = true;
int size = 0, sum = 0;
for (int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
if (st[j]) continue;
int s = dfs(j);
size = max(size, s);
sum += s;
}
size = max(size, n - sum - 1);
ans = min(ans, size);
return sum + 1;
}
int main()
{
scanf("%d", &n);
memset(h, -1, sizeof h);
for (int i = 0; i < n - 1; i ++ )
{
int a, b;
scanf("%d%d", &a, &b);
add(a, b), add(b, a);
}
dfs(1);
printf("%d\n", ans);
return 0;
}
2.3 蓝桥杯-【第十二届】【省赛】【B组】:时间显示
1. 问题描述
2. 问题分析
类比求一个十进制数的个位数、十位数、百位数…,用取余的方法来得出相应的秒、分、时
3. 问题解决
#include <iostream>
using namespace std;
typedef long long LL;
int main()
{
LL t;
scanf("%lld", &t);
t /= 1000;
t %= (24*60*60);
int ss = t % 60;
t /= 60;
int mm = t % 60;
t /= 60;
int hh = t;
printf("%02d:%02d:%02d\n", hh, mm, ss);
return 0;
}