hud4517小小明系列故事——遊戲的煩惱

小小明系列故事——遊戲的煩惱

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 816    Accepted Submission(s): 289


Problem Description
  小小明最近在玩一款遊戲,它由n*m大小的矩陣構成,矩陣上會隨機產生一些黑色的點,這些點它們可能會連在一起也可能會分開,這些點的個數沒有限制,但是每個1*1方格中最多隻可能有一個黑點產生。遊戲要求玩家以最短的時間用x*y的小矩陣覆蓋這個大矩陣,覆蓋的要求有以下2點:
  1. x*y大小的小矩陣內必須有x*y個黑點。
  2. 多個小矩陣可以重疊,但是每個小矩陣放置的位置必須是獨一無二的,即不同的小矩陣內的黑點不能完全相同。例如1*2的矩陣可以橫着放,也可以豎着放,這兩種方法是不同的,即使它們可能共用黑點。
  小小明是個粗心的孩子,他嘗試了很多遍都無法將所有的符合要求的小矩陣找到,聰明的你,能不能告訴煩惱中的小小明這個大矩陣裏有多少個滿足要求的小矩陣呢?
 

Input
題目有多組測試數據(不多於100個);
每組測試數據的第一行包含2個正整數n和m,然後第二行是x和y(n,m,x,y的意思如題),接下來n行,每行m個字符,其中’ * ’表示黑點,’ . ’表示空白。
n和m爲0則結束輸入。

[Technical Specification]
0 < n, m <= 2000
0 < x, y <= 1000
 

Output
請計算並輸出一共有多少個滿足要求的小矩陣,每組輸出佔一行。
 

Sample Input
2 3 1 2 **. .** 0 0
 

Sample Output
3
 

Source
不得不說自己弱。
這其實就是一道動歸,只不過要優化成一維的。也可說是一道規律題。
代碼貼上自己看看吧!
#include<stdio.h>
#include<string.h>
int map[2005][2005],l[2005],l2[2005],h[2005];
int main()
{
	int n,m,i,j,ans,x,y;
	char c;
	while(scanf("%d %d",&n,&m)&&n!=0)
	{
		ans=0;
		scanf("%d %d",&x,&y);
		getchar();
		memset(h,0,sizeof h);
		memset(l,0,sizeof l);
		memset(l2,0,sizeof l2);
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=m;j++)
			{
				scanf("%c",&c);
				if(c=='*')
					map[i][j]=1;
				else
					map[i][j]=0;
			}
			getchar();
		}
		for(i=1;i<=n;i++)
			for(j=1;j<=m;j++)
			{
				if(map[i][j]==1)
				{
					h[j]++;
					if(h[j]>=x)
						l[j]=l[j-1]+1;
					else
						l[j]=0;
					if(h[j]>=y)
						l2[j]=l2[j-1]+1;
					if(h[j]>=x&&l[j]>=y)
						ans++;
					if(h[j]>=y&&l2[j]>=x&&x!=y)
						ans++;
				}
				else
					h[j]=l[j]=l2[j]=0;

			}
			printf("%d\n",ans);
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章