Spirit

2005年12月19日 #

Google Code Jam - WordPath

- Implementation
public class WordPath {    
    
public int countPaths(String[] grid, String find) {
        
int length = grid.length + 2;      
        
        
//convert "grid" from String to char matrix
        char[][] charGrid = new char[length][length];
        
for (int i = 0; i < length; i++) {
            
for (int j = 0; j < length; j++) {
                
if (i == 0 || i == length - 1 || j == 0 || j == length - 1)
                    charGrid[i][j] 
= '0';
                
else
                    charGrid[i][j] 
= grid[i - 1].charAt(j - 1);
            }
        }
        
        
//convert "find" from String to char array
        char[] charFind = new char[find.length()];
        
for (int k = 0; k < find.length(); k++)
            charFind[k] 
= find.charAt(k);

        
//use three dimensions "degree" to hold the in-degree of the vertex of graph
        int[][][] degree = new int[length][length][find.length()];        

        
// k=0
        for (int i = 0; i < length; i++)
            
for (int j = 0; j < length; j++) {
                degree[i][j][
0= ((charGrid[i][j] == charFind[0]) ? 1 : 0);
            }
        
        
// fill the degree 
        for (int k = 1; k < find.length(); k++) {
            
for (int i = 0; i < length; i++)
                
for (int j = 0; j < length; j++) {
                    
if (charGrid[i][j] != charFind[k])
                        degree[i][j][k] 
= 0;
                    
else {
                        degree[i][j][k] 
= degree[i - 1][j - 1][k - 1+ degree[i - 1][j][k - 1]
                                
+ degree[i - 1][j + 1][k - 1+ degree[i + 1][j - 1][k - 1]
                                
+ degree[i + 1][j][k - 1+ degree[i + 1][j + 1][k - 1]
                                
+ degree[i][j - 1][k - 1+ degree[i][j + 1][k - 1];

                    }

                }
        }
        
        
//calculate the sum
        int sum = 0;
        
for (int i = 0; i < length; i++)
            
for (int j = 0; j < length; j++) {
                sum 
+= degree[i][j][find.length() - 1];
                
if (sum > 1000000000) {
                    
return -1;
                }
            }
        
return sum;
    }
}

- TestCase
public class WordPathTest extends TestCase {
    
public void testCountPaths() {
        WordPath wordPath 
= new WordPath();
        assertEquals(
2, wordPath.countPaths(new String[] { "ABC""FED""GAI" }, "ABCDEA"));
        assertEquals(
0, wordPath.countPaths(new String[] { "ABC""DEF""GHI" }, "ABCD"));
        assertEquals(
108, wordPath.countPaths(new String[] { "AA""AA" }, "AAAA"));
        assertEquals(
56448, wordPath.countPaths(new String[] { "ABABA""BABAB""ABABA""BABAB""ABABA" },
                
"ABABABBA"));
        assertEquals(
-1, wordPath.countPaths(new String[] { "AAAAA""AAAAA""AAAAA""AAAAA""AAAAA" },
                
"AAAAAAAAAAA"));
        assertEquals(
0, wordPath.countPaths(new String[] { "AB""CD" }, "AA"));
    }
}

This testcase finished after 0.015 seconds on my pc.

http://forum.javaeye.com/viewtopic.php?p=106316#106316

posted @ 2005-12-19 16:36 Spirit 阅读(335) | 评论 (0)编辑 收藏