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 閱讀(359) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 体育| 胶州市| 黎平县| 安平县| 平安县| 龙海市| 屏东市| 洪湖市| 霍城县| 淮北市| 信阳市| 巩义市| 三亚市| 西吉县| 石河子市| 五寨县| 故城县| 卓尼县| 沁水县| 广河县| 玉林市| 星子县| 营口市| 毕节市| 南丰县| 娱乐| 定安县| 苗栗市| 贵南县| 射阳县| 革吉县| 繁峙县| 深圳市| 都安| 密山市| 鹿邑县| 丰都县| 柞水县| 拜城县| 灵石县| 永清县|