3039: 材质贴图
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit: 46 Accepted:19
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; }