TOJ3039: 材质贴图

3039: 材质贴图 分享至QQ空间

Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByte
Total Submit: 46            Accepted:19

Description

3D游戏中的场景经常用材质贴图来表现,例如石头、水面等。
通常,材质贴图是一张正方形的位图,上下边界的像素对应相同,左右边界的像素也对应相同。例如下图中,左边是一张材质贴图,而右边的不是(左右边界不同)。

给定一张n×n的位图,请在这张位图中寻找一块材质贴图,使得材质贴图尺寸最大。下图中黄色区域就是最大的材质贴图,虽然黄色区域左上角2×2的位图也是材质贴图,但不是最大的。

Input

输入包含多组数据。
每组数据第一行是一个整数n (1≤n≤50),表示位图的大小。
然后n行每行n个在0到255之间的整数,描述位图的内容。
输入数据以n=0结束,不要处理这组数据。

Output

对每组数据输出最大的材质贴图的边长。请注意,1×1的位图也是材质贴图。

Sample Input
2
255 0
0 127
5
5 251 127 11 195
23 13 0 13 23
211 0 13 0 67
211 13 0 13 23
1 251 127 11 47
0
Sample Output
1
3


其实暴力枚举就好了,但是这个2就成了对角线,没有想到怎么把他优化掉

#include<stdio.h>
int n,a[51][51];
int la()
{
    for(int k=n; k>2; k--)
        for(int i=0; i<=n-k; i++)
            for(int j=0; j<=n-k; j++)
            {
                int f=1;
                for(int l=0; l<k; l++)
                    if(a[i][j+l]!=a[i+k-1][j+l]||a[i+l][j]!=a[i+l][j+k-1])
                    {
                        f=0;
                        break;
                    }
                if(f)return k;
            }
    for(int i=0; i<=n-2; i++)
        for(int j=0; j<=n-2; j++)
        {
            if(a[i][j]==a[i+1][j+1]&&a[i+1][j]==a[i][j+1])
                return 2;
        }
    return 1;
}
int main()
{
    while(scanf("%d",&n),n)
    {
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                scanf("%d",a[i]+j);
        printf("%d
",la());
    }
    return 0;
}
原文地址:https://www.cnblogs.com/BobHuang/p/7442931.html