TOJ3039: 材质贴图

本文介绍了一个用于3D游戏中寻找最大尺寸材质贴图的算法实现。该算法通过枚举不同大小的正方形区域并检查其是否符合材质贴图的定义(即上下和左右边界像素一致)来确定最大材质贴图的边长。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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\n",la());
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/BobHuang/p/7442931.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值