目录
3.17
这天主要在写题;
https://vjudge.net/contest/547627#problem/J
该题的数据看着挺吓人的,但其实不难,我们只需要记录每个城市的相邻城市,然后搜索过去,看最后一个城市是不是起点城市;但是这题要注意一个点,就是该题要求按字典序输出,于是要对那些相邻城市进行排序;
#include<stdio.h>
int a[30][5];
int book[35];
int ans[25];
int m, t;
int cnt = 1, cntzl;
void dfs(int x)
{
for (int i = 1; i <= 3; i++)
{
if (book[a[x][i]] == 0)
{
book[a[x][i]] = 1;
ans[cnt++] = a[x][i];
if (a[x][i] == m && cnt == 21)
{
cntzl++;
printf("%d: %d", cntzl,m);
for (int i = 1; i <= 20; i++)
{
printf(" %d",ans[i]);
}
printf("\n");
}
dfs(a[x][i]);
book[a[x][i]] = 0;
cnt--;
}
}
}
int main()
{
for (int i = 1; i <= 20; i++)
{
scanf("%d%d%d", &a[i][1], &a[i][2], &a[i][3]);
for (int j = 1; j < 3; j++)
{
for (int k = i + 1; k <= 3; k++)
{
if (a[i][k] < a[i][j])
{
t = a[i][k];
a[i][k] = a[i][j];
a[i][j] = t;
}
}
}
}
while (1)
{
cntzl = 0;
scanf("%d", &m);
cnt = 1;
if (m == 0)
{
break;
}
dfs(m);
}
return 0;
}
https://vjudge.net/contest/547627#problem/M
该题就是一个标准的bfs的题目,但是这个题目巨多坑,首先要考虑传送过去是墙壁,这种情况会撞死,我们可以直接将那个传送门看成墙壁;其次要考虑传送过去就是终点的情况,最后也是最坑的,要考虑传送过去后还是个传送,这种情况相当于没有传送,将那个传送看成平路就行了;
#include<stdio.h>
char map[2][15][15];
int book[2][15][15];
int m, n, cnt, T;
int sx, sy, sz;
struct node
{
int x, y, z;
int step;
}a[500];
int nexty[4] = { 0,1,0,-1 };
int nextz[4] = { 1,0,-1,0 };
int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d%d%d", &m, &n, &cnt);
for (int i = 0; i < m; i++)
{
scanf("%s", map[0][i]);
}
getchar();
for (int i = 0; i < m; i++)
{
scanf("%s", map[1][i]);
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j ++ )
{
book[0][i][j] = 0;
book[1][i][j] = 0;
if (map[0][i][j] == '#' && map[1][i][j] == '#')
{
map[0][i][j] = '*';
map[1][i][j] = '*';
}
if ((map[0][i][j] == '#' && map[1][i][j] == '*') || (map[0][i][j] == '*' && map[1][i][j] == '#'))
{
map[0][i][j] = '*';
map[1][i][j] = '*';
}
if (map[0][i][j] == 'P')
{
sx = 0;
sy = i;
sz = j;
map[0][i][j] = '.';
}
if (map[1][i][j] == 'P')
{
sx = 1;
sy = i;
sz = j;
map[1][i][j] = '.';
}
}
}
int tail = 0, head = 0;
a[tail].x = 0;
a[tail].y = 0;
a[tail].z = 0;
a[tail].step = 0;
tail++;
book[0][0][0] = 1;
int flag = 0;
while (head < tail)
{
for (int i = 0; i < 4; i++)
{
int tx = a[head].x;
int ty = a[head].y + nexty[i];
int tz = a[head].z + nextz[i];
if (ty<0 || ty>=m || tz < 0 || tz >= n||map[tx][ty][tz]=='*')
continue;
if (book[tx][ty][tz] == 0 && map[tx][ty][tz] == '.')
{
book[tx][ty][tz] = 1;
a[tail].step = a[head].step + 1;
a[tail].x = tx;
a[tail].y = ty;
a[tail].z = tz;
tail++;
}
if (book[tx][ty][tz] == 0 && map[tx][ty][tz] == '#' )
{
book[tx][ty][tz] = 1;
tx = (tx + 1) % 2;
book[tx][ty][tz] = 1;
a[tail].x = tx;
a[tail].y = ty;
a[tail].z = tz;
a[tail].step = a[head].step + 1;
tail++;
}
if (ty == sy && tz == sz&&tx==sx)
{
if (a[head].step + 1 <= cnt)
{
printf("YES\n");
flag = 1;
break;
}
else
{
printf("NO\n");
flag = 1;
break;
}
}
}
if (flag == 1)
{
break;
}
head++;
}
if (flag == 0)
{
printf("NO\n");
}
}
return 0;
}
3.18
这天是周六,主要是看了Java和晚上的比赛;
Java没学多少,就写题解吧;
https://codeforces.com/contest/1806/problem/A
cf上面的题目大多都是偏逻辑的题,这题就是,只能向右上方和左边走,那也就是说这两个点所构成的直线的斜率不能小于1;并且起点一定要在终点的下面;然后最小步数的话,就是先一直往右上方走,直到与终点等高,然后再往左走,直到走到终点;最小步数就是2*(y2-y1)+x1-x2;
#include<stdio.h>
long long t, a, b, c, d;
int main()
{
scanf("%lld", &t);
while (t--)
{
scanf("%lld%lld%lld%lld", &a, &b, &c, &d);
if (b > d)
{
printf("-1\n");
continue;
}
if (c - a > d - b)
{
printf("-1\n");
}
else
{
printf("%lld\n", 2 * (d - b)+a-c);
}
}
return 0;
}
https://codeforces.com/contest/1806/problem/B
这题其实就只有三种可能,0,1,2;当0的个数少于n/2+n%2时,每个0的旁边都可以插一个元素进去,这样就可以让最低分数为0;当全部为0时,输出1;当只有0和1时,就输出2;例如11100000这种情况,我们进行重新排序,10101000,这样的话他的最低分数就为2了;还有就是当这个数组除了0,1还有其他的元素时,就可以输出1;
#include<stdio.h>
int t, n;
int a[250000], book[250000];
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
book[a[i]]++;
}
if (book[0] == n)
{
printf("1\n");
}
else if (book[0] == 0)
{
printf("0\n");
}
else if (book[0] <= n / 2 + n%2)
{
printf("0\n");
}
else
{
int t = 0;
for (int i = 1; i < 200000; i++)
{
if (book[i] != 0)
{
t = i;
break;
}
}
if (n-book[0]-book[t]>=1)
{
printf("1\n", t);
}
else
{
if (t >= 2)
{
printf("1\n");
}
if (t == 1)
{
printf("2\n");
}
}
}
for (int i = 0; i < 200000; i ++ )
{
book[i] = 0;
}
}
return 0;
}
3.19
这天看了Java的视频比较多,学习了Java的输入输出,条件语句,循环语句,数组,除了数组与c语言有些不同,其他的都差不多,有许多细节;
然后还打了一场cf,和一场ATC;