您的位置:首页 > 其它

Chessboard(HDU1838)

2016-04-04 17:11 218 查看
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1838

题目是说给出一个矩阵,然后求下图类似的棋盘,边长最大的有几个。

输入01代表黑白。

然后这个问题是两个问题1.求出满足图形条件的最大边长,2.求出个数。

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
char G[2005][2005];
int dp[2005][2005];//以i,j为结尾的点所能达到的最大边长
int t,n,ans,maxlen;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
getchar();
ans=0;
maxlen=0;
memset(dp,0,sizeof(dp));
for(int i=0; i<n; i++)//存图
scanf("%s",G[i]);

for(int i=0; i<n; i++)//边界处理,从顶上或者左边衍生出来的第一个边长必然是1
dp[i][0]=dp[0][i]=1;

for(int i=1; i<n; i++)
{
for(int j=1; j<n; j++)
{
if(G[i][j]==G[i-1][j-1]&&G[i][j]!=G[i-1][j]&&G[i][j]!=G[i][j-1])//满足三边条件
dp[i][j]=min(min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1])+1;//从左,上,左上挑出最小的边长+1
else dp[i][j]=1;//不满足条件这个点啥都不算,就赋值成1
if(G[i][j]=='1')//每次比对产生边长最大值
maxlen=max(maxlen,dp[i][j]);
}
}
for(int i=0; i<n; i++)//再次遍历,求出这个边长下,最大的个数
{
for(int j=0; j<n; j++)
{
if(maxlen==dp[i][j]&&G[i][j]=='1')//这里记得判‘1‘,题目规定好了右下角必然是黑色的
ans++;
}
}
cout<<maxlen<<" "<<ans<<endl;

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: