首页 > 学院 > 开发设计 > 正文

蓝桥杯 - 算法训练 暗恋 C语言实现

2019-11-06 07:27:19
字体:
来源:转载
供稿:网友
算法训练 暗恋题目:问题描述  同在一个高中,他却不敢去找她,虽然在别人看来,那是再简单不过的事。暗恋,是他唯一能做的事。他只能在每天课间操的时候,望望她的位置,看看她倾心的动作,就够了。操场上的彩砖啊,你们的位置,就是他们能够站立的地方,他俩的关系就像砖与砖之间一样固定,无法动摇。还记得当初铺砖的工人,将整个操场按正方形铺砖(整个操场可视为R行C列的矩阵,矩阵的每个元素为一块正方形砖块),正方形砖块有两种,一种为蓝色,另一种为红色。我们定义他和她之间的“爱情指标”为最大纯色正方形的面积,请你写一个程序求出“爱情指标”。输入格式  第一行两个正整数R和C。  接下来R行C列描述整个操场,红色砖块用1来表示,蓝色砖块用0来表示。输出格式  一个数,表示他和她之间的“爱情指标”。样例输入5 80 0 0 1 1 1 0 11 1 0 1 1 1 1 10 1 1 1 1 1 0 11 0 1 1 1 1 1 01 1 1 0 1 1 0 1样例输出9数据规模和约定  40%的数据R,C<=10;  70%的数据R,C<=50;  100%的数据R,C<=200;分析:题目数据规模在中上的程度,直接递归暴力肯定拿不到满分,小编也是拿了90分,还有一个运行超时,之后再补上。递归暴力的思路很简单,对于每一个点分三个部分递归,分别上该点的正右方,正下方和右下方;取三个方向的边的返回值的最小值。代码在此:
#include<stdio.h>#define SIZE 200//int map[SIZE][SIZE] = {{0,0,0,1,1,1,0,1},{1,1,0,1,1,1,1,1},{0,1,1,1,1,1,0,1},{1,0,1,1,1,1,1,0},{1,1,1,0,1,1,0,1}};	//测试数据 int map[SIZE][SIZE];int R,C;int judge_r (int x,int y,int type,int k) {	//某点右方向递归 	if(x > R-1 || y > C-1)	//超过测试值回滚 		return k;	if(map[x][y+1] != type)		return k;	return judge_r(x,y+1,type,k+1);}int judge_c (int x,int y,int type,int k) {	//某点下方向递归 	if(x > R-1 || y > C-1)	//超过测试值回滚 		return k;	if(map[x+1][y] != type)		return k;	return judge_c(x+1,y,type,k+1);}int judge (int x,int y,int type,int k) {	//某点右下方向递归 	if(x > R-1 || y > C-1)	//超过测试值回滚 		return k;	int re;	//返回值 	int temp;	//临时值存储 	if(map[x][y+1] != type || map[x+1][y] != type)	//如果右边和下边不同色回滚 		return k;	if(map[x+1][y+1] != type)	//如果右下边不同色回滚		return k;		re = judge_r(x,y+1,type,k+1);	//获取三个递归方向的返回值(边长)中最小的值 		temp = judge_c(x+1,y,type,k+1);	re = re > temp ? temp : re;		temp = judge(x+1,y+1,type,k+1);	re = re > temp ? temp : re;		return re;}int main () {		int i,j;	int maxSize = 0;	//最长的边		scanf("%d%d", &R ,&C);	for(i = 0; i < R; i ++){		for(j = 0; j < C; j ++){			scanf("%d", &map[i][j]);		}	}	int temp;	for(i = 0; i < R; i ++){		for(j = 0; j < C; j ++){			int temp = judge(i,j,map[i][j],1);			maxSize = maxSize > temp ? maxSize :temp;		}	}		PRintf("%d",maxSize*maxSize);		return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表