蓝桥杯

来源:互联网 发布:无人知是故人来by 编辑:程序博客网 时间:2024/04/27 22:30
算法训练 暗恋
题目:

问题描述
  同在一个高中,他却不敢去找她,虽然在别人看来,那是再简单不过的事。暗恋,是他唯一能做的事。他只能在每天课间操的时候,望望她的位置,看看她倾心的动作,就够了。操场上的彩砖啊,你们的位置,就是他们能够站立的地方,他俩的关系就像砖与砖之间一样固定,无法动摇。还记得当初铺砖的工人,将整个操场按正方形铺砖(整个操场可视为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;}


0 0