Chessboard(HDU1838)
2016-04-04 17:11
218 查看
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1838
题目是说给出一个矩阵,然后求下图类似的棋盘,边长最大的有几个。
输入01代表黑白。
然后这个问题是两个问题1.求出满足图形条件的最大边长,2.求出个数。
代码如下:
题目是说给出一个矩阵,然后求下图类似的棋盘,边长最大的有几个。
输入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; }
相关文章推荐