1 疫情防控网格化
全屏浏览题目
切换布局
作者 吴云鹏
单位 郑州大学
由于防控形势严峻,现在z市已经开始了全区域的网格化封控管理。该市的区域可以看成一个矩形,其中所有主干道都是水平或垂直的,并且贯穿整个区域。如图所示,黑色表示城区的边界,红色表示城区的主干道,其中边界和主干道宽度都为1,且不存在边界与主干道、主干道与主干道相邻的情况。
为了方便网格化管理,我们定义网格单元是由城区边界或主干道围成的区域,且任意网格单元内不能包含主干道。上图中,该城区共被分割成了16个网格单元。
现在给出该区域的地图,需要你统计出该城区划分出了多少个网格单元,以方便安排医务人员和应急物资。
在计算机中,图像的本质就是二维的矩阵。为了方便处理,我们将上述图像中城区边界及里面的内容转化为了二维字符矩阵,详细见输入格式描述。
输入格式:
第一行输入两个整数n,m(3≤n,m≤100)
其后n行,每行m个字符,字符有'*'和'#'两种。'*'代表城区边界或主干道,'#'代表网格单元内区域。
输出格式:
输出一行一个整数,代表地图中的网格单元个数。
输入样例:
3 7
*******
*##*##*
*******
输出样例:
2
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, m;
char a[101][101];
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
int flag = 0;
int flag1 = 0;
int flag2 = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] == '*') {
flag++;
}
}
if (flag == m) {
flag1++;
}
flag = 0;
}
int flag3 = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (a[j][i] == '*')flag3++;
}
if (flag3 == n) {
flag2++;
}
flag3 = 0;
}
cout << (flag1-1)*(flag2-1);
return 0;
}
2 子区域计数
全屏浏览题目
切换布局
作者 吴云鹏
单位 郑州大学
由于防控形势严峻,现在z市已经开始了全区域的网格化封控管理。该市的区域可以看成一个矩形,其中所有主干道都是水平或垂直的,并且贯穿整个区域。如图所示,黑色表示城区的边界,红色表示城区的主干道。其中边界和主干道宽度都为1,且不存在边界与主干道、主干道与主干道相邻的情况。
为了方便网格化管理,我们定义网格单元是由城区边界或主干道围成的区域,且任意网格单元内不能包含主干道。上图中,该城区共被分割成了16个网格单元。
同时,网格化管理的本质思想是“分治”,不同的划分粒度对于管理效率会产生深远的影响。所以,这次W同学思考的不仅仅是网格单元,而是子网格。
子网格的定义为:子网格也是一个矩形,且子网格矩形4个角的对应点都位于边界与边界、边界与主干道、主干道与主干道的交点上。我们认为两个子网格是相同的,当且仅当两个子网格的4个角对应点全部重合。根据这个定义,我们可以知道,任意的网格单元也是一种子网格,整个城区的矩形也是一种特殊的子网格。
同样给出上述的图像,你能否帮小W计算下,有多少种可能的子网格?
输入格式:
第一行输入两个整数n,m(3≤n,m≤100)
其后n行,每行m个字符,字符有'*'和'#'两种。'*'代表城区边界或主干道,'#'代表网格单元内区域。
输出格式:
输出一行一个整数,代表符合条件不同子网格的个数。
输入样例:
3 7
*******
*##*##*
*******
输出样例:
3
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, m;
char a[101][101];
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
int flag = 0;
int flag1 = 0;
int flag2 = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] == '*') {
flag++;
}
}
if (flag == m) {
flag1++;
}
flag = 0;
}
int flag3 = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (a[j][i] == '*')flag3++;
}
if (flag3 == n) {
flag2++;
}
flag3 = 0;
}
int nn, mm;
nn = flag1 - 1;
mm = flag2 - 1;
int ff = 0;
int f = 0;
for (int i = 1; i <= mm; i++) {
for (int r = i; r <= mm; r++) {
for (int j = 1; j <= nn; j++) {
ff += j;
}
}
}
cout << ff;
return 0;
}
3 怀旧的思考挑战
全屏浏览题目
切换布局
作者 吴云鹏
单位 郑州大学
疫情来了,柴刘青山在寝室关着非常无聊,和室友一起玩跑跑卡丁车这款老游戏。
这款游戏有一个模式叫做组队竞速,每局8个人,分为两队,最终比拼哪队总分更高。
第一名冲线得到8分,第二名得到7分,以此类推,第八名得到1分。
柴刘青山好奇自己队伍在某一局游戏中是否能得到某个总分,如果可以,有多少种排名情况可以达成该总分?
后记:柴刘青山和室友们寻求过短暂的放松后,决定还是在学业上开启“竞速模式”,约定共同努力学习,参加“战疫杯”!
输入格式:
第一行一个正整数n,表示猜想的n总分。 0≤n≤10000
输出格式:
如果可以达成,输出一个正整数x,代表有多少种排名情况。
如果不能达成,输出NO。
输入样例:
25
输出样例:
1
样例解释1
柴刘青山的队伍需要取得1、2、3、5名,对应8+7+6+4=25。有且仅有这一种情况。
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int flag = 0;
int ff = 1;
if (n <= 26) {
for (int i = 1; i <= 5; i++) {
for (int j = i+1; j <= 6; j++) {
for (int r = j+1; r <= 7; r++) {
for (int f = r+1; f <= 8; f++) {
if ((i + j + r + f) == n) {
flag++;
}
}
}
}
}
}
if(flag>0)
cout << flag;
else
cout<<"NO";
return 0;
}