import java.util.ArrayList;
import java.util.List;
class MineSweeperAlgorithm {
// this minesweeper algorithm uses O(1) space complexity
// set verbose to false to hide the step-by-step loggging
private static final boolean verbose = false;
private static int stepCount = 1;
public static void main
(String[] args
) { MineSweeperAlgorithm ins = new MineSweeperAlgorithm();
int[][] matrix;
// make a test case
stepCount = 1;
matrix = new int[5][];
matrix[0] = new int[]{0, 0, 0, 1, 0};
matrix[1] = new int[]{0, 1, 1, 1, 1};
matrix[2] = new int[]{0, 0, 0, 0, 1};
matrix[3] = new int[]{0, 1, 1, 0, 1};
matrix[4] = new int[]{0, 0, 1, 0, 1};
// run the test
System.
out.
println("Result is " + ins.validate(matrix));
// make another test case
stepCount = 1;
matrix = new int[5][];
matrix[0] = new int[]{0, 0, 0, 1, 0};
matrix[1] = new int[]{0, 1, 0, 1, 0};
matrix[2] = new int[]{0, 1, 0, 1, 0};
matrix[3] = new int[]{0, 1, 0, 1, 0};
matrix[4] = new int[]{0, 1, 0, 0, 0};
// run the test
System.
out.
println("Result is " + ins.validate(matrix));
// make another test case
stepCount = 1;
matrix = new int[5][];
matrix[0] = new int[]{0, 0, 0, 1, 0};
matrix[1] = new int[]{0, 1, 1, 1, 0};
matrix[2] = new int[]{0, 1, 0, 1, 0};
matrix[3] = new int[]{0, 0, 0, 1, 0};
matrix[4] = new int[]{0, 1, 0, 0, 0};
// run the test
System.
out.
println("Result is " + ins.validate(matrix));
}
public boolean validate(int[][] puzzle){//4-connectivity
boolean firstScan = true;
for(int r=0;r<puzzle.length;r++){
for(int c=0;c<puzzle[0].length;c++){
if( 1==puzzle[r][c] )
continue;
if( !firstScan && 0==puzzle[r][c])
return false;
int x = r, y = c;
while(true){
while( 0==puzzle[x][y] ){
puzzle[x][y] = 2;
if( x+1<puzzle.length && 0==puzzle[x+1][y] ){
x += 1;
continue;
}
if( y+1<puzzle[0].length && 0==puzzle[x][y+1] ){
y += 1;
continue;
}
if( x-1>=0 && 0==puzzle[x-1][y] ){
x -= 1;
continue;
}
if( y-1>=0 && 0==puzzle[x][y-1] ){
y -= 1;
}
}
while( 2==puzzle[x][y] && !((x+1<puzzle.length && 0==puzzle[x+1][y])|| (y+1<puzzle[0].length && 0==puzzle[x][y+1])
|| (x-1>=0 && 0==puzzle[x-1][y]) || (y-1>=0 && 0==puzzle[x][y-1])) ){
puzzle[x][y] = 3;
if( x+1<puzzle.length && 2==puzzle[x+1][y] ){
x += 1;
continue;
}
if( y+1<puzzle[0].length && 2==puzzle[x][y+1] ){
y += 1;
continue;
}
if( x-1>=0 && 2==puzzle[x-1][y] ){
x -= 1;
continue;
}
if( y-1>=0 && 2==puzzle[x][y-1] ){
y -= 1;
}
}
if(x+1<puzzle.length && 0==puzzle[x+1][y])
x += 1;
else if(y+1<puzzle[0].length && 0==puzzle[x][y+1])
y += 1;
else if(x-1>=0 && 0==puzzle[x-1][y])
x -= 1;
else if (y-1>=0 && 0==puzzle[x][y-1])
y -= 1;
else
break;
}
firstScan = false;
}
}
return true;
}
}
aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCmNsYXNzIE1pbmVTd2VlcGVyQWxnb3JpdGhtIHsKCiAgICAvLyB0aGlzIG1pbmVzd2VlcGVyIGFsZ29yaXRobSB1c2VzIE8oMSkgc3BhY2UgY29tcGxleGl0eQoKICAgIC8vIHNldCB2ZXJib3NlIHRvIGZhbHNlIHRvIGhpZGUgdGhlIHN0ZXAtYnktc3RlcCBsb2dnZ2luZwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7CiAgICBwcml2YXRlIHN0YXRpYyBpbnQgc3RlcENvdW50ID0gMTsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgTWluZVN3ZWVwZXJBbGdvcml0aG0gaW5zID0gbmV3IE1pbmVTd2VlcGVyQWxnb3JpdGhtKCk7CgogICAgICAgIGludFtdW10gbWF0cml4OwogICAgICAgIC8vIG1ha2UgYSB0ZXN0IGNhc2UKICAgICAgICBzdGVwQ291bnQgPSAxOwogICAgICAgIG1hdHJpeCA9IG5ldyBpbnRbNV1bXTsKICAgICAgICBtYXRyaXhbMF0gPSBuZXcgaW50W117MCwgMCwgMCwgMSwgMH07CiAgICAgICAgbWF0cml4WzFdID0gbmV3IGludFtdezAsIDEsIDEsIDEsIDF9OwogICAgICAgIG1hdHJpeFsyXSA9IG5ldyBpbnRbXXswLCAwLCAwLCAwLCAxfTsKICAgICAgICBtYXRyaXhbM10gPSBuZXcgaW50W117MCwgMSwgMSwgMCwgMX07CiAgICAgICAgbWF0cml4WzRdID0gbmV3IGludFtdezAsIDAsIDEsIDAsIDF9OwoKICAgICAgICAvLyBydW4gdGhlIHRlc3QKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdCBpcyAiICsKICAgICAgICAgICAgICAgIGlucy52YWxpZGF0ZShtYXRyaXgpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKCiAgICAgICAgLy8gbWFrZSBhbm90aGVyIHRlc3QgY2FzZQogICAgICAgIHN0ZXBDb3VudCA9IDE7CiAgICAgICAgbWF0cml4ID0gbmV3IGludFs1XVtdOwogICAgICAgIG1hdHJpeFswXSA9IG5ldyBpbnRbXXswLCAwLCAwLCAxLCAwfTsKICAgICAgICBtYXRyaXhbMV0gPSBuZXcgaW50W117MCwgMSwgMCwgMSwgMH07CiAgICAgICAgbWF0cml4WzJdID0gbmV3IGludFtdezAsIDEsIDAsIDEsIDB9OwogICAgICAgIG1hdHJpeFszXSA9IG5ldyBpbnRbXXswLCAxLCAwLCAxLCAwfTsKICAgICAgICBtYXRyaXhbNF0gPSBuZXcgaW50W117MCwgMSwgMCwgMCwgMH07CgogICAgICAgIC8vIHJ1biB0aGUgdGVzdAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0IGlzICIgKwogICAgICAgICAgICAgICAgaW5zLnZhbGlkYXRlKG1hdHJpeCkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwoKICAgICAgICAvLyBtYWtlIGFub3RoZXIgdGVzdCBjYXNlCiAgICAgICAgc3RlcENvdW50ID0gMTsKICAgICAgICBtYXRyaXggPSBuZXcgaW50WzVdW107CiAgICAgICAgbWF0cml4WzBdID0gbmV3IGludFtdezAsIDAsIDAsIDEsIDB9OwogICAgICAgIG1hdHJpeFsxXSA9IG5ldyBpbnRbXXswLCAxLCAxLCAxLCAwfTsKICAgICAgICBtYXRyaXhbMl0gPSBuZXcgaW50W117MCwgMSwgMCwgMSwgMH07CiAgICAgICAgbWF0cml4WzNdID0gbmV3IGludFtdezAsIDAsIDAsIDEsIDB9OwogICAgICAgIG1hdHJpeFs0XSA9IG5ldyBpbnRbXXswLCAxLCAwLCAwLCAwfTsKCiAgICAgICAgLy8gcnVuIHRoZSB0ZXN0CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHQgaXMgIiArCiAgICAgICAgICAgICAgICBpbnMudmFsaWRhdGUobWF0cml4KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICB9CiAgICAKCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKGludFtdW10gcHV6emxlKXsvLzQtY29ubmVjdGl2aXR5CiAgICAgICAgYm9vbGVhbiBmaXJzdFNjYW4gPSB0cnVlOwogICAgICAgIGZvcihpbnQgcj0wO3I8cHV6emxlLmxlbmd0aDtyKyspewogICAgICAgICAgICAgICAgZm9yKGludCBjPTA7YzxwdXp6bGVbMF0ubGVuZ3RoO2MrKyl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAxPT1wdXp6bGVbcl1bY10gKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiggIWZpcnN0U2NhbiAmJiAwPT1wdXp6bGVbcl1bY10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHggPSByLCB5ID0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUodHJ1ZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIDA9PXB1enpsZVt4XVt5XSApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV6emxlW3hdW3ldID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4KzE8cHV6emxlLmxlbmd0aCAmJiAwPT1wdXp6bGVbeCsxXVt5XSApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHkrMTxwdXp6bGVbMF0ubGVuZ3RoICYmIDA9PXB1enpsZVt4XVt5KzFdICl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeC0xPj0wICYmIDA9PXB1enpsZVt4LTFdW3ldICl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeS0xPj0wICYmIDA9PXB1enpsZVt4XVt5LTFdICl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAyPT1wdXp6bGVbeF1beV0gJiYgISgoeCsxPHB1enpsZS5sZW5ndGggJiYgMD09cHV6emxlW3grMV1beV0pfHwgKHkrMTxwdXp6bGVbMF0ubGVuZ3RoICYmIDA9PXB1enpsZVt4XVt5KzFdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoeC0xPj0wICYmIDA9PXB1enpsZVt4LTFdW3ldKSB8fCAoeS0xPj0wICYmIDA9PXB1enpsZVt4XVt5LTFdKSkgKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1enpsZVt4XVt5XSA9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeCsxPHB1enpsZS5sZW5ndGggJiYgMj09cHV6emxlW3grMV1beV0gKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB5KzE8cHV6emxlWzBdLmxlbmd0aCAmJiAyPT1wdXp6bGVbeF1beSsxXSApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHgtMT49MCAmJiAyPT1wdXp6bGVbeC0xXVt5XSApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHktMT49MCAmJiAyPT1wdXp6bGVbeF1beS0xXSApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih4KzE8cHV6emxlLmxlbmd0aCAmJiAwPT1wdXp6bGVbeCsxXVt5XSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHkrMTxwdXp6bGVbMF0ubGVuZ3RoICYmIDA9PXB1enpsZVt4XVt5KzFdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoeC0xPj0wICYmIDA9PXB1enpsZVt4LTFdW3ldKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHktMT49MCAmJiAwPT1wdXp6bGVbeF1beS0xXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNjYW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cgp9Cg==