Spirit

          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 on 2005-12-19 16:36 Spirit 閱讀(359) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 梅河口市| 长沙市| 周至县| 滦平县| 灵丘县| 红原县| 本溪市| 扶沟县| 宕昌县| 宝清县| 郴州市| 丹东市| 通化县| 永济市| 桓台县| 上杭县| 安达市| 大田县| 峡江县| 高邮市| 武川县| 宁陕县| 越西县| 黄浦区| 沙雅县| 富顺县| 嘉荫县| 西城区| 思南县| 巨鹿县| 灵川县| 金湖县| 富民县| 高邑县| 景德镇市| 隆安县| 车致| 万全县| 辽宁省| 松原市| 山西省|