第四次机考(2019)D. 卫星照片二

这题还是很有意思的。
注意到题目里有一个关键信息:路肯定是贯穿了整张图的,所以实际上路把地图分成了几个区域:
1 1 0 1 1 0 0 1 1 1
1 1 0 1 1 0 0 1 1 1
1 1 0 1 1 0 0 1 1 1
1 1 0 1 1 0 0 1 1 1
1 1 0 1 1 0 0 1 1 1
1 1 0 1 1 0 0 1 1 1
1 1 0 1 1 0 0 1 1 1
0 0 0 0 0 0 0 0 0 0
1 1 0 1 1 0 0 1 1 1
1 1 0 1 1 0 0 1 1 1
(二值化之后的地图)
只要找到横纵方向的街区数,再相乘就好了。

如果真这么简单,岂不美哉。这题的特殊情况比较多,用化归的思想,在3x3区域内,我们可以找到所有的特殊情况。

难点1:街区计数器
我们要数出某一行/列里的街区数时,最先想到的应该是自动机。检查一下你的自动机能不能数出正确的街区数。
1 0 1(应为2个) 0 1 0(应为1个) 1 1 0 (应为1个) 1 1 1 (应为1个) 0 0 1(应为1个)

难点2:特殊情况
最自然的想法当然是只数第一列和第一行的街区数,再相乘,但是遇到这样的
0 0 0
1 1 1
1 1 1
显然就不对,只数第一行话就变成了0,但是实际上第二行有街区。
特别地,还有回字形的情况
0 0 0
0 1 0
0 0 0
所以我们应该逐行逐列去读街区数,取第一个非零的街区数作为行/列的街区数,因为只要出现了街区数不为0的行/列,往下的分布也是这样的(不排除底下还有零行,不过已经无所谓了)。
也可以数道路。

#include <stdio.h>
enum {
   ROAD,BLOCK};
void preProcess(int**,int,int);//预处理函数,将读取的地图二值化,我们并不关心灰度值的具体数值,只需要知道它代表什么就行了
//这本篇0代表道路,1代表街区,与枚举变量保持一致
void debug_printSheet(int**,int,int);//打印当前的地图状态,有兴趣的可以把main里我注释掉的函数执行试试
int main()
{
   	
	int m,n,i,j,k,tmp;
	scanf("%d%d",&m,&n);

	int **mainPtr=(int**)malloc(sizeof(int*)*m)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
二级C语言上试题汇编 第01套: 给定程序中,函数fun的功能是:将形参n所指变量中,各位上为偶数的数去除,剩余的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n传回所指变量。 例如,输入一个数:27638496,新的数:为739。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。 注意:源程序存放在生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include <stdio.h> void fun(unsigned long *n) { unsigned long x=0, i; int t; i=1; while(*n) { t=*n % __1__; if(t%2!= __2__) { x=x+t*i; i=i*10; } *n =*n /10; } *n=__3__; } main() { unsigned long n=-1; while(n>99999999||n<0) { printf("Please input(0<n<100000000): "); scanf("%ld",&n); } fun(&n); printf("\nThe result is: %ld\n",n); } 解题思路: 第一处:t是通过取模的方式来得到*n的个位数字,所以应填:10。 第二处:判断是否是奇数,所以应填:0。 第三处:最后通形参n来返回新数x,所以应填:x。 给定程序MODI1.C中函数 fun 的功能是:计算n!。 例如,给n输入5,则输出120.000000。 请改正程序中的错误,使程序能输出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include <stdio.h> double fun ( int n ) { double result = 1.0 ; if n = = 0 return 1.0 ; while( n >1 && n < 170 ) result *= n-- return result ; } main ( ) { int n ; printf("Input N:") ; scanf("%d", &n) ; printf("\n\n%d! =%lf\n\n", n, fun(n)) ; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值