1. 程式人生 > >2013-BIT程式設計 2.修剪草坪 -- 暴力

2013-BIT程式設計 2.修剪草坪 -- 暴力

2.修剪草坪

有一個n*m的草坪(1<=n,m<=100),草坪中的草原來的高度都是100。現在使用割草機修剪草坪,來得到各種各樣的圖案。割草機只能橫著或者豎著割草。每次割草都會先設定一個高度,割完之後會把比設定高度高的草都割成設定的高度。比如草原來是5 2 8,設定高度為4,那麼割完之後就變成了4 2 4。
現在給出一個圖案,問是否可以把草坪割成圖案的樣子。
輸入第一行包含兩個整數n和m。
接下來為n行輸入,每行包含m個不大於100的正整數。
如果可以修剪成輸入的圖案,則輸出“YES”,否則輸出“NO”。

測試輸入關於“測試輸入”的幫助

期待的輸出關於“期待的輸出”的幫助

時間限制關於“時間限制”的幫助

記憶體限制關於“記憶體限制”的幫助

額外程序關於“{$a} 個額外程序”的幫助

測試用例 1

  1. 3 3
  2. 2 1 2
  3. 1 1 1
  4. 2 1 2

1秒

64M

0

分析:得到規律:草坪上的每一個高度要是其所在行或者所在列的最值,才能是YES,否則是NO。

#include<stdio.h>
int max(int a,int b)
{
	return a>b?a:b;
}
int main()
{
	int n,m,flag;
	int map[105][105];
	int m1[105][105],m2[105][105];
	int _min[105];
	
	while(scanf("%d%d",&n,&m)!=EOF){
		flag = 1;
		for (int i = 0; i < 105; i++)	
			_min[i] = 0;	
		for (int i = 0; i < n; i++)		
			for (int j = 0; j < m; j++)
			{
				scanf("%d",&map[i][j]);
				_min[i] = max(_min[i],map[i][j]);
				m1[i][j] = m2[i][j] = 0;
			}
		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
			{
				if(map[i][j] == _min[i])
					m1[i][j] = 1;
			}
		for (int i = 0; i < 105; i++)	
			_min[i] = 0;	
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++)
			{				
				_min[i] = max(_min[i],map[j][i]);
			}
		for (int i = 0; i < m && flag; i++)
			for (int j = 0; j < n && flag; j++)
			{
				if(map[j][i] == _min[i])
					m2[j][i] = 1;
				if(m2[j][i]==0 && m1[j][i]==0)
					flag = 0;				
			}
		if(flag)printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}