欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AOJ102材质贴图

程序员文章站 2022-06-11 14:50:22
...

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

AOJ102材质贴图


给定一张n×n的位图,请在这张位图中寻找一块材质贴图,使得材质贴图尺寸最大。下图中黄色区域就是最大的材质贴图。

AOJ102材质贴图

程序输入说明

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

程序输出说明

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

程序输入样例

可见格式 带空格和换行符的格式 带空格和换行符的格式说明
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


 

程序输出样例

Original Transformed 带空格和换行符的格式说明
1
3

提示

题目来源

第二届招商银行杯程序设计大赛 普及组

#include <stdio.h>
int arr[55][55],a1,b1;
int dfs(int i,int j,int k)
{
	for(a1=i;a1<=i+k;a1++)
	{
		if(arr[a1][j]!=arr[a1][j+k]) return 1;
	}
	for(b1=j;b1<=j+k;b1++)
	{
		if(arr[i][b1]!=arr[i+k][b1]) return 1;
	}
	return 2; 
}
int main(){
	int n,i,j,k;
	while(1){
		int max=0;
		scanf("%d",&n);
		if(!n) break;
		for(i=1;i<=n;i++){
			for(j=1;j<=n;j++){
				scanf("%d",&arr[i][j]);
			}
		}
//		printf("%d",arr[0][0]);
		for(i=1;i<=n;i++){
			for(j=1;j<=n;j++){
				for(k=0;k+j<=n&&k+i<=n;k++)
				{
					if(arr[i][j]==arr[i][j+k]&&arr[i][j]==arr[i+k][j]
					&&arr[i][j]==arr[i+k][j+k])
					{
//						printf("%d %d %d===",i,j,k);
						int temp=dfs(i,j,k);//是1不满足 
//						printf("%d==",temp);
						if(temp==2){
							if(max<k) max=k;
//							printf("%d\n",max);
						}
					}
				}
			}
		}
		printf("%d\n",max+1);
	}
	return 0;
}