kuoe0
4/14/2013 - 8:19 AM

Google Code Jam 2013 - Qualification Round - B - Lawnmower

Google Code Jam 2013 - Qualification Round - B - Lawnmower

/*=============================================================================
#     FileName: qround - b - Lawnmower.cpp
#         Desc: Google Code Jam 2013 - Qualification Round - B - Lawnmower
#       Author: KuoE0
#        Email: kuoe0.tw@gmail.com
#     HomePage: http://kuoe0.ch/
#      Version: 0.0.1
#   LastChange: 2013-04-14 16:17:59
#      History:
=============================================================================*/

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <algorithm>
using namespace std;

bool check( vector< int > &row, vector< int > &col, vector< vector< int > > &lawn ) {

  vector< vector< int > > temp( row.size(), vector< int >( col.size(), 0 ) );

	for ( int i = 0; i < row.size(); ++i )
		for ( int j = 0; j < col.size(); ++j )
			if ( min( row[ i ], col[ j ] ) != lawn[ i ][ j ] )
				return false;
	return true;
}

int main() {

	int test;

	scanf( "%d", &test );

	for ( int t = 0; t < test; ++t ) {

		int R, C;

		scanf( "%d %d", &R, &C );

		vector< vector< int > > lawn( R, vector< int >( C, 0 ) );

		for ( int i = 0; i < R; ++i )
			for ( int j = 0; j < C; ++j ) {
				int x;
				scanf( "%d", &x );
				lawn[ i ][ j ] = x;
			}

		vector< int > row( R, 0 ), col( C, 0 );

		for ( int i = 0; i < R; ++i )
			for ( int j = 0; j < C; ++j ) {
				row[ i ] = max( row[ i ], lawn[ i ][ j ] );
				col[ j ] = max( col[ j ], lawn[ i ][ j ] );
			}

		printf( "Case #%d: %s\n", t + 1, check( row, col, lawn ) ? "YES" : "NO" );

	}
	return 0;
}