蓝桥杯 - 算法训练 暗恋 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分,还有一个运行超时,之后再补上。递归暴力的思路很简单,对于每一个点分三个部分递归,分别上该点的正右方,正下方和右下方;取三个方向的边的返回值的最小值。
代码在此:
题目:
问题描述
同在一个高中,他却不敢去找她,虽然在别人看来,那是再简单不过的事。暗恋,是他唯一能做的事。他只能在每天课间操的时候,望望她的位置,看看她倾心的动作,就够了。操场上的彩砖啊,你们的位置,就是他们能够站立的地方,他俩的关系就像砖与砖之间一样固定,无法动摇。还记得当初铺砖的工人,将整个操场按正方形铺砖(整个操场可视为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; }
相关文章推荐
- 蓝桥杯 - 算法训练 邮票 C语言实现
- 蓝桥杯 - 算法训练 最大最小公倍数 C语言实现
- 蓝桥杯 - 算法训练 字串统计 C语言实现
- 蓝桥杯 - 算法训练 删除多余括号 C语言实现
- 蓝桥杯 - 算法训练 明明的随机数 C语言实现
- 蓝桥杯 - 算法训练 字符串编辑 C语言实现
- 蓝桥杯 - 算法训练 阿尔法乘积 C语言实现
- 蓝桥杯 - 算法训练 蜜蜂飞舞 C语言实现
- 蓝桥杯 - 算法训练 最短路 Bellman-Ford算法 C语言实现
- 蓝桥杯 - 算法训练 - 卡片游戏 链表 C语言实现
- 蓝桥杯 - 算法训练 学做菜 C语言实现
- 蓝桥杯 - 算法训练 比赛安排 C语言实现
- 蓝桥杯 - 算法训练 反置数 C语言实现
- 蓝桥杯 - 算法训练 友好数 C语言实现
- 蓝桥杯 - 算法训练 矩阵乘方 C语言实现
- 蓝桥杯 - 算法训练 连续正整数的和 C语言实现
- 蓝桥杯 - 算法训练 数的划分 C语言实现
- 蓝桥杯 - 算法训练 反置数 C语言实现
- 蓝桥杯 - 算法训练 字符串的展开 C语言实现
- 蓝桥杯 - 算法训练 寂寞的数 C语言实现