您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-04 22:14 501 查看
算法训练 暗恋
题目:

问题描述

  同在一个高中,他却不敢去找她,虽然在别人看来,那是再简单不过的事。暗恋,是他唯一能做的事。他只能在每天课间操的时候,望望她的位置,看看她倾心的动作,就够了。操场上的彩砖啊,你们的位置,就是他们能够站立的地方,他俩的关系就像砖与砖之间一样固定,无法动摇。还记得当初铺砖的工人,将整个操场按正方形铺砖(整个操场可视为R行C列的矩阵,矩阵的每个元素为一块正方形砖块),正方形砖块有两种,一种为蓝色,另一种为红色。我们定义他和她之间的“爱情指标”为最大纯色正方形的面积,请你写一个程序求出“爱情指标”。

输入格式

  第一行两个正整数R和C。

  接下来R行C列描述整个操场,红色砖块用1来表示,蓝色砖块用0来表示。

输出格式

  一个数,表示他和她之间的“爱情指标”。

样例输入

5 8

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

样例输出

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: