汉堡包在大街上大摇大摆的走着,看着手机上一道难倒数万人的小学数学题:
1 + 1 = 0
1 + 6 = 1
6 + 6 = 2
8 + 1 = 2
8 + 6 = 3
汉堡包看完之后发现上面这些加法的答案就是看1,6,8中圈圈的个数嘛!
突然之间,所有大厦上的LED屏幕上的广告全部变成数字1,6,8三个数字的随机闪现。
现给你一块n*m的LED屏幕,上面有且仅有一个数字(1,6,or 8),请你输出你看见的那个字母。
输入格式:
第一行输入两个整数n,m(2<= m, n <= 1000);
接下来n行,每行由m个数字0和1组成,其中1表示数字1,6,8的组成部分。
输出格式:
输出一个整数,代表图形表示的数字。
输入样例:
7 7
0 0 0 0 0 0 0
0 0 1 1 1 0 0
0 0 1 0 1 0 0
0 0 1 1 1 0 0
0 0 1 0 1 0 0
0 0 1 1 1 0 0
0 0 0 0 0 0 0
输出样例:
8
代码:
#include<stdio.h>
void appeared(int num1[], int num1_in_col)
// 判断变量 num1_in_col 的值是否在 num1[]里出现过.
// 如果为0,直接return.
// 如果没有,存入数组,并且用来统计的 num1[0]++.
// 如果有,直接return不进行操作.
{
if (num1_in_col == 0) return;
else if (num1[0] == 0) // 数组为空,直接存入第一个非0值
{
num1[0] = 1;
num1[1] = num1_in_col;
}
else
{
for (int i = 1; i <= num1[0]; i++)
{
if (num1_in_col == num1[i]) return;
}
num1[++num1[0]] = num1_in_col;
}
}
int main()
{
int m, n; scanf("%d %d", &n, &m);
int display[n][m];
// num1[5]用来存储每一列出现的1的不同的值, num1_in_col来存储当前列1的数量
//其中num1[0]用来存储不同1的个数(也就是num1数组的长度了)
int i, j, num1[5] = {0}, num1_in_col;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &display[i][j]);
}
}
for (i = 0; i < m; i++)
{
num1_in_col = 0;
// 对列扫描,统计该列1出现的次数.
for (j = 0; j < n; j++) {if (display[j][i] == 1) num1_in_col += 1;}
// 使用appeared来判断该列1出现的次数是否在之前列出现过
appeared(num1, num1_in_col);
}
if (num1[0] == 1) // 1的值有1种情况
printf("1");
else if (num1[0] == 2) // 1的值有2种不同情况
printf("8");
else // 1的值有3种不同情况
printf("6");
return 0;
}
总结:
这道题刚拿到手其实是有点无头绪的,之后遇到高人指点才算稍微悟道
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1个数: 5 5 5 5 3 3 3 3 4 4 5 5 3 3 3 3 5 5
上面是1,6,8的三个模型(省略0) 可以发现
1:对于含有1的列,含有的1的数量只有1种
6:对于含有1的列,含有的1的数量有3种
8:对于含有1的列,含有的1的数量有2种
因为题目保证有些仅有1/6/8,所以我们只要先读取地图,再统计含有1的就能做题了.