• Hihocoder-福字


    Hihocoder-福字

    题目1 : 福字

    时间限制:6000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    新年到了,你收到了一副画。你想找到里面最大的福字。

    一副画是一个n × n的矩阵,其中每个位置都是一个非负整数。

    一个福字被定义成是大小为 k 的正方形,满足其中的每个位置上的数都恰好比他的左边的那个和上边的那个大1(如果左边或上边的那个不存在的话就无此要求)。

    比如

    1 2 3
    2 3 4
    3 4 5
    

    就是一个福字。(注意左上角可以是任何非负整数)。

    你想找到这个矩阵中最大的福字的大小。

    输入

    第一行一个数 n,表示矩阵大小。(n ≤ 1000)

    接下来 n 行,每行 n 个数,表示这个矩阵。矩阵中的数在0到108之间。

    输出

    一行一个数表示最大的福字的大小。

    样例输入
    4
    1 2 3 0
    2 3 4 0
    3 4 5 0
    0 0 0 0
    样例输出
    3

    题解: 

    直接法, O(n^2) 的时间复杂度

    #include <cstdio> 
    #include <cstdlib> 
    #include <cstring> 
    using namespace std; 
    const int MAXN = 1000 + 5; 
    
    int n, ans, num[MAXN][MAXN], cnt[MAXN][MAXN], is_point[MAXN][MAXN];
    
    int main()
    {
    
    	scanf("%d", &n); 
    
    	memset(num, 0, sizeof(num)); 
    	for(int i=1; i<=n; ++i) {
    		for(int j=1; j<=n; ++j) {
    			scanf("%d", &num[i][j]); 
    		}
    	}
    	memset(is_point, 0, sizeof(is_point)); 
    	memset(cnt, 0, sizeof(cnt)); 
    	ans = 0; 
    
    	for(int i=1; i<=n; ++i) {
    		for(int j=1; j<=n; ++j) {
    			if(i>1 && j>1 && num[i][j] == num[i][j-1]+1 && num[i][j] == num[i-1][j]+1) {
    				is_point[i][j] = is_point[i-1][j-1] + 1; 
    				cnt[i][j] = cnt[i-1][j-1] + 1; 
    			}else if(i > 1 && num[i][j] == num[i-1][j] + 1){
    				cnt[i][j] = cnt[i-1][j] + 1; 
    			}else if(j > 1 && num[i][j] == num[i][j-1] + 1){
    				cnt[i][j] = cnt[i][j-1] + 1; 
    			}
    			if(is_point[i][j] > ans){
    				ans = is_point[i][j]; 
    			}
    		}
    	}
    	printf("%d
    ", (ans+1) );
    
    	return 0;
    }
    

      

  • 相关阅读:
    ubuntu 11.10下 配置环境变量 对 adb无效
    一个NB的博客 个人感觉非常有用
    SVN 错误提交配置文件,
    代码格式真的很重要
    图解DB2体系结构(转)
    DB2基本概念——实例,数据库,模式,表空间
    DB2 数据库安全总述
    DB2关于标识列(自增列)的对比试验、使用示例
    DB2的SQL编程(转)
    DB2 数据类型(转)
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/6417200.html
Copyright © 2020-2023  润新知