posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          USACO 1.1.5 Checker Challenge

          Posted on 2007-06-03 19:22 ZelluX 閱讀(603) 評論(0)  編輯  收藏 所屬分類: Algorithm
          一開始什么優化都沒有,過不了了(記得以前是可以的?。?br>然后用了三個hash數組記錄各列、對角線棋子的放置情況,再加上左右對稱解的優化,總算在0.828秒里過了
          /*
          PROG: checker
          ID: 06301031
          LANG: C++
          */


          #include 
          <iostream>
          #include 
          <fstream>

          using namespace std;

          int g[13];
          bool column[13], diag1[25], diag2[25];
          int n;
          int countResult = 0;
          int mid = 0, firstHalf = 0;
          ifstream fin(
          "checker.in");
          ofstream fout(
          "checker.out");

          void DFS(int t) {
              
          int i;
              
          if (t == n) {
                  countResult
          ++;
                  
          if (countResult <= 3{
                      fout 
          << g[0+ 1;
                      
          for (i = 1; i < n; i++{
                          fout 
          << " " << g[i] + 1;
                      }

                      fout 
          << endl;
                  }

                  
          return;
              }


              
          for (g[t] = 0; g[t] < n; g[t]++{
                  
          if ((countResult > 3&& (t == 0)) {
                      
          if (g[t] == n / 2{
                          firstHalf 
          = countResult;
                          
          if (n % 2 == 0{
                              fout 
          << firstHalf * 2 << endl;
                              exit(
          0);
                          }

                      }

                      
          if ((g[t] == n / 2 + 1&& (n % 2 == 1)) {
                          mid 
          = countResult - firstHalf;
                          fout 
          << firstHalf * 2 + mid << endl;
                          exit(
          0);
                      }

                  }

                  
          if (column[g[t]]) {
                      
          continue;
                  }

                  
          if (diag1[g[t] + t]) {
                      
          continue;
                  }

                  
          if (diag2[g[t] - t + n]) {
                      
          continue;
                  }


                  diag1[g[t] 
          + t] = true;
                  diag2[g[t] 
          - t + n] = true;
                  column[g[t]] 
          = true;
                  DFS(t 
          + 1);
                  diag1[g[t] 
          + t] = false;
                  diag2[g[t] 
          - t + n] = false;
                  column[g[t]] 
          = false;

          nextPosition:
                  ;
              }

          }


          int main() {
              fin 
          >> n;
              
          int i;
              
          for (i = 0; i < n; i++{
                  column[i] 
          = false;
              }

              
          for (i = 0; i < n * 2 -1; i++{
                  diag1[i] 
          = false;
                  diag2[i] 
          = false;
              }

              DFS(
          0);
              fout 
          << countResult << endl;
              fout.close();
              
          return 0;
          }

          主站蜘蛛池模板: 彝良县| 渭源县| 五台县| 正安县| 甘谷县| 万安县| 防城港市| 鹤壁市| 班玛县| 龙井市| 临邑县| 泾源县| 突泉县| 五大连池市| 双牌县| 周至县| 恩平市| 威海市| 屏南县| 灵石县| 普兰店市| 泗水县| 温泉县| 监利县| 黔南| 紫阳县| 泰和县| 水富县| 尚志市| 河源市| 和政县| 琼结县| 土默特右旗| 泽普县| 温州市| 昆山市| 金乡县| 措美县| 绵阳市| 昭苏县| 皋兰县|