#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;}
新闻热点
疑难解答