class SearchInMatrix {
/**
* @param args
*/
public static void main
( String [ ] args
) { int [ ] [ ] mat = new int [ ] [ ] { { 10 , 20 , 30 , 40 } ,{ 15 , 25 , 35 , 45 } , { 27 , 29 , 37 , 48 } ,{ 32 , 33 , 39 , 50 } } ;
int rowcount = 4 ,colCount= 4 ,key= 50 ;
for ( int i= 0 ; i< rowcount; i++ )
for ( int j= 0 ; j< colCount; j++ )
search( mat,0 ,rowcount- 1 ,0 ,colCount- 1 ,mat[ i] [ j] ) ;
}
public static void search( int [ ] [ ] mat,int fromRow,int toRow,int fromCol, int toCol,int key) {
// Search middle key.
// If middle key is lesser then search lower horizontal matrix and right hand side matrix
// If middle key is greater then search left vertical matrix and right hand side matrix
int i = fromRow+ ( toRow- fromRow ) / 2 ;
int j = fromCol+ ( toCol- fromCol ) / 2 ;
if ( mat[ i] [ j] == key) {
System .
out .
println ( "Found " + key
+ " at " + i
+ " " + j
) ; } else {
// right hand side matrix
// Provided it is different than current call
if ( i!= toRow || j!= fromCol) {
search( mat,fromRow,i,j,toCol,key) ;
}
// Special case for iteration with 1*2 matrix
// mat[i][j] and mat[i][j+1] are only two elements.
// So just check second element
if ( fromRow == toRow && fromCol + 1 == toCol) {
if ( mat[ fromRow] [ toCol] == key) {
System .
out .
println ( "Found " + key
+ " at " + fromRow
+ " " + toCol
) ; }
}
if ( mat[ i] [ j] < key) {
// search lower horizontal matrix.
// Provided such matrix exists
if ( i+ 1 <= toRow) {
search( mat,i+ 1 ,toRow,fromCol,toCol,key) ;
} else {
//System.out.println("Such lower matrix doe not exisit");
}
} else {
// left vertical matrix
// Provided such matrix exists
if ( j- 1 >= fromCol) {
search( mat,fromRow,toRow,fromCol,j- 1 ,key) ;
} else {
//System.out.println("Such vertical matrix doe not exisit");
}
}
}
}
}
CmNsYXNzIFNlYXJjaEluTWF0cml4IHsKCgkvKioKCSAqIEBwYXJhbSBhcmdzCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQlpbnRbXVtdICBtYXQgPSBuZXcgaW50W11bXSB7IHsxMCwgMjAsIDMwLCA0MH0sezE1LCAyNSwgMzUsIDQ1fSwgezI3LCAyOSwgMzcsIDQ4fSx7MzIsIDMzLCAzOSwgNTB9fTsKCQlpbnQgcm93Y291bnQgPSA0LGNvbENvdW50PTQsa2V5PTUwOwoJCWZvcihpbnQgaT0wO2k8cm93Y291bnQ7IGkrKykKCQkJZm9yKGludCBqPTA7ajxjb2xDb3VudDsgaisrKQoJCQkJc2VhcmNoKG1hdCwwLHJvd2NvdW50LTEsMCxjb2xDb3VudC0xLG1hdFtpXVtqXSk7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBzZWFyY2goaW50W11bXSBtYXQsaW50IGZyb21Sb3csaW50IHRvUm93LGludCBmcm9tQ29sLCBpbnQgdG9Db2wsaW50IGtleSl7CgkJLy8gU2VhcmNoIG1pZGRsZSBrZXkuIAoJCS8vIElmIG1pZGRsZSBrZXkgaXMgbGVzc2VyIHRoZW4gc2VhcmNoIGxvd2VyIGhvcml6b250YWwgbWF0cml4IGFuZCByaWdodCBoYW5kIHNpZGUgbWF0cml4CgkJLy8gSWYgbWlkZGxlIGtleSBpcyBncmVhdGVyIHRoZW4gc2VhcmNoIGxlZnQgdmVydGljYWwgbWF0cml4IGFuZCByaWdodCBoYW5kIHNpZGUgbWF0cml4CgkJaW50IGkgPSBmcm9tUm93KyAodG9Sb3ctZnJvbVJvdyApLzI7CgkJaW50IGogPSBmcm9tQ29sKyAodG9Db2wtZnJvbUNvbCApLzI7CgkJaWYobWF0W2ldW2pdPT1rZXkpewoJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kICIra2V5KyAiIGF0ICIrIGkgKyAiICIgKyBqKTsKCQl9ZWxzZSB7CgkJCS8vIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXgKCQkJLy8gUHJvdmlkZWQgaXQgaXMgZGlmZmVyZW50IHRoYW4gY3VycmVudCBjYWxsCgkJCWlmKGkhPXRvUm93IHx8IGohPWZyb21Db2wpewoJCQkJc2VhcmNoKG1hdCxmcm9tUm93LGksaix0b0NvbCxrZXkpOwoJCQl9CgkJCS8vIFNwZWNpYWwgY2FzZSBmb3IgaXRlcmF0aW9uIHdpdGggMSoyIG1hdHJpeAoJCQkvLyBtYXRbaV1bal0gYW5kIG1hdFtpXVtqKzFdIGFyZSBvbmx5IHR3byBlbGVtZW50cy4KCQkJLy8gU28ganVzdCBjaGVjayBzZWNvbmQgZWxlbWVudAoJCQlpZihmcm9tUm93ID09IHRvUm93ICYmIGZyb21Db2wgKzEgPT0gdG9Db2wpewoJCQkJaWYobWF0W2Zyb21Sb3ddW3RvQ29sXSA9PSAga2V5KXsKCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kICIra2V5KyAiIGF0ICIrIGZyb21Sb3cgKyAiICIgKyB0b0NvbCk7CgkJCQl9CgkJCX0KCQkJCgkJCWlmKG1hdFtpXVtqXTxrZXkpewoJCQkJLy8gc2VhcmNoIGxvd2VyIGhvcml6b250YWwgbWF0cml4LiAKCQkJCS8vIFByb3ZpZGVkIHN1Y2ggbWF0cml4IGV4aXN0cwoJCQkJaWYoaSsxPD10b1Jvdyl7CgkJCQkJc2VhcmNoKG1hdCxpKzEsdG9Sb3csZnJvbUNvbCx0b0NvbCxrZXkpOwoJCQkJfWVsc2V7CgkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2ggbG93ZXIgbWF0cml4IGRvZSBub3QgZXhpc2l0Iik7CgkJCQl9CgkJCX1lbHNlewoJCQkJLy8gbGVmdCB2ZXJ0aWNhbCBtYXRyaXggCgkJCQkvLyBQcm92aWRlZCBzdWNoIG1hdHJpeCBleGlzdHMKCQkJCWlmKGotMT49ZnJvbUNvbCl7CgkJCQkJc2VhcmNoKG1hdCxmcm9tUm93LHRvUm93LGZyb21Db2wsai0xLGtleSk7CgkJCQl9ZWxzZXsKCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiU3VjaCB2ZXJ0aWNhbCBtYXRyaXggZG9lIG5vdCBleGlzaXQiKTsKCQkJCX0KCQkJfQoKCQkJfQoJCX0KfQ==