Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

起始点状态不能为Temp[2],结束点状态不能为Temp[0],加一个判断就行了

Posted by zhucheng at 2005-08-04 11:24:20 on Problem 2523
In Reply To:烦糙 可以帮我看看代码吗?不知道该怎么改了 :( Posted by:littlelotus at 2005-08-04 11:17:43
> #include<iostream>
> #include<stdio.h>
> #include<string>
> 
> using namespace std;
> 
> char Temp[6][4][4]  = {
>      {" * ",
>       "** ",
>       "   "
>      },
>      {" * ",
>       " **",
>       "   "
>      },
>      {"   ",
>       " **",
>       " * "
>      },
>      {"   ",
>       "** ",
>       " * "
>      },
>      {"   ",
>       "***",
>       "   "
>      },
>      {" * ",
>       " * ",
>       " * "
>      }
> };
> ////////////////////////////test_begin:
>     int TTest[100][100][100];
>     int TestRoad[100][100];
>     void TestOutput(int m, int n,int i);
> ////////////////////////////////////tset_end.
> 
> int Max;
> 
> int pp[100][100];
> 
> int mm[100][100];
> int TTT[100][100];
> int RoadT[100];
> char Re[1000][1000];
> //////////////////////////////////////
> int Road[100];
> void Dfs(int, int, int );
> //
> //////////////////////////////////////////////
> bool Right;
> void Output(int, int );
> ///////////////////////////////////////////////
> int NUM;
> ////////////////////////////////////////////////
> int Judge(int L, int R)
> {
>     int i, j, k;
>     for(i = 0; i < 6; i++){
>         bool good = true;
>         for(j = 0; j < 3; j++){
>             if(!good)
>                 break;
>             for(k = 0; k < 3; k++)
>                 if(Re[L + j][R + k] != Temp[i][j][k]){
>                     good = false;
>                 }
>         }
>         if(good)
>             return i;
>     }
>     return -1;
> }
> //
> int main()
> {
>  //  freopen("Ct.", "w", stdout);
>     int m, n, i, j, t;
>     int T;
>     scanf("%d", &T);
>     for(t = 0; t < T; t++){
>         scanf("%d%d", &m, &n);
>         Max = m * n;
>         getchar();
>         NUM = 0;
>         for(i = 0; i < m*4 + 1; i++)
>                 gets(Re[i]);
>         for(i = 0; i < m; i++)
>             for(j = 0; j < n; j++){
>                 pp[i][j] = Judge(i * 4 + 1, j * 4 + 1);
>             }
>         for(i = 0; i < m; i++)
>             for(j = 0; j < n; j++)
>                 mm[i][j] = -1;
>         Right = true;
>         Dfs(m, n, 0);
>         if(NUM > 0){
>             NUM = cheat[t];
>             Output(m, n);
>         }
>         cout << "Number of solutions: " << NUM << endl;
>     }
>     return 0;
> }
> 
> void Dfs(int m, int n, int step)
> {
>     int i, j;
>     if(Road[step - 1] == m * n - 1){
>         NUM ++;
>         if(Max > step){
>             Max = step;
>             for(i = 0; i < m; i++)
>                 for(j = 0; j < n; j++)
>                     TTT[i][j] = mm[i][j];
>             for(i = 0; i < step; i++)
>                 RoadT[i] = Road[i];
>             NUM = 1;
>        }
>         return ;
>     }
>     if(step >= m * n)
>         return;
>     ///////////////////////////////////////////////////
>     
>     if(step == 0){
>         Road[0] = 0;
>         if(pp[0][0] >= 4){
>             
>             mm[0][0] = 5;
>             Dfs(m, n, step + 1);
>             mm[0][0] = -1;
>             mm[0][0] = 4;
>             Dfs(m, n, step + 1);
>             mm[0][0] = -1;
>         }
>         else if(pp[0] >= 0){
>                 mm[0][0] = 1;
>                 Dfs(m, n, step + 1);
>                 mm[0][0] = -1;
>                 mm[0][0] = 3;
>                 Dfs(m, n, step + 1);
>                 mm[0][0] = -1;
>     //            mm[0][0] = 2;
>     //            Dfs(m, n, step + 1);
>     //            mm[0][0] = -1;
>         }
>         return;
>     }
>     
>     
>     int last = step - 1;
>     
>     int lastx = Road[last] / n;
>     int lasty = Road[last] % n;
>     
>     int x, y;
>     ///////////////////////////////first right:
>     if(lasty + 1 < n){
>         x = lastx;
>         y = lasty + 1;
>         if(mm[x][y] == -1)
>         if(mm[lastx][lasty] == 1 || mm[lastx][lasty] == 2 || mm[lastx][lasty] == 4){
>             if(pp[x][y] >= 0 && pp[x][y] < 4){
>                 Road[step] = x * n + y;
>                 if(x == m - 1 && y == n - 1){
>                     mm[x][y] = 3;
>                     Dfs(m, n, step + 1);
>                     mm[x][y] = -1;
>                 }
>                 else{
>                 mm[x][y] = 0; // 3
>                 Dfs(m, n, step + 1);
>                 mm[x][y] = -1;
>                 mm[x][y] = 3;
>                 Dfs(m, n, step + 1);
>                 mm[x][y] = -1;
>                 }
>             }
>             else if(pp[x][y] >= 4 && pp[x][y] < 6){
>                 Road[step] = x * n + y;
>                 mm[x][y] = 4;
>                 Dfs(m, n, step + 1);
>                 mm[x][y] = -1;
>             }
>         }
>     }
>     
>     //secend  down:
>     if(lastx + 1 < m){
>         x = lastx + 1;
>         y = lasty;
>         if(mm[x][y] == -1)
>         if(mm[lastx][lasty] == 2 ||mm[lastx][lasty]==3 ||mm[lastx][lasty]==5){
>             if(pp[x][y] >= 0 && pp[x][y] < 4){
>                 Road[step] = x * n + y;
>                 //
>                 if(x == m - 1 && y == n - 1){
>                     mm[x][y] = 1;
>                     Dfs(m, n, step +1);
>                     mm[x][y] = -1;
>                 }
>                 //
>                 else{
>                 mm[x][y] = 0; //1
>                 Dfs(m, n, step + 1);
>                 mm[x][y] = -1;
>                 mm[x][y] = 1;
>                 Dfs(m, n, step +1);
>                 mm[x][y] = -1;}
>             }
>             else if(pp[x][y] == 4 || pp[x][y] == 5){
>                 Road[step] = x * n + y;
>                 mm[x][y] = 5;
>                 Dfs(m, n, step + 1);
>                 mm[x][y] = -1;
>             }
>         }
>     }
>     ////////////////////////////////////////third up:
>     if(lastx - 1 >= 0){
>         x = lastx - 1;
>         y = lasty;
>         if(mm[x][y] == -1)
>         if(mm[lastx][lasty] == 0||mm[lastx][lasty]==1||mm[lastx][lasty]==5){
>             if(pp[x][y] >= 0 && pp[x][y] < 4){
>                 Road[step] = x * n + y;
>                 mm[x][y] = 2; // 3
>                 Dfs(m, n, step + 1);
>                 mm[x][y] = -1;
>                 mm[x][y] = 3;
>                 Dfs(m, n, step + 1);
>                 mm[x][y] = -1;
>             }
>             else if(pp[x][y] == 4 || pp[x][y] == 5){
>                 Road[step] = x * n + y;
>                 mm[x][y] = 5;
>                 Dfs(m, n, step + 1);
>                 mm[x][y] = -1;
>             }
>         }
>     }
>     //////////////////////////////////////fourth left:
>     if(lasty - 1 >= 0){
>         x = lastx;
>         y = lasty - 1;
>         if(mm[x][y] == -1){
>             if(mm[lastx][lasty]==0||mm[lastx][lasty]==3||mm[lastx][lasty]==4){
>                 if(pp[x][y] >= 0 && pp[x][y] < 4){
>                     Road[step] = x * n + y;
>                     mm[x][y] = 1; // 3
>                     Dfs(m, n, step + 1);
>                     mm[x][y] = -1;
>                     mm[x][y] = 2;
>                     Dfs(m, n, step + 1);
>                     mm[x][y] = -1;
>                 }
>                 else if(pp[x][y] == 4 || pp[x][y] == 5){
>                     Road[step] = x * n + y;
>                     mm[x][y] = 4;
>                     Dfs(m, n, step + 1);
>                     mm[x][y] = -1;
>                 }
>             }
>         }
>     }
>     return;
> }
> 
> void Output(int m, int n)
> {
>     int TT[100][100];
>     int i, j, k;
>     for(i = 0; i < m; i++)
>         for(j = 0; j < n; j++)
>             TT[i][j] = -1;
>     
>     for(i = 0; i < Max; i++){
>         int x = RoadT[i] / n;
>         int y = RoadT[i] % n;
>         TT[x][y] = TTT[x][y];
>     }
>     
> /////////////////////////////
> //////////////////////////////
>     for(i = 0; i < m; i++){
>         for(j = 0; j < n; j++)
>             cout << "+---";
>         cout << "+" << endl;
>         for(k = 0; k < 3; k++){
>             for(j = 0; j < n; j++){
>                 if(TT[i][j] == -1){
>                     cout << "|   ";
>                 }
>                 else{
>                     cout << "|" << Temp[TT[i][j]][k][0]<<Temp[TT[i][j]][k][1]<<Temp[TT[i][j]][k][2];
>                     
>                 }
>             }
>             cout << "|" << endl;
>         }
>     }
>     for(j = 0; j < n; j++)
>         cout << "+---";
>     cout << "+" << endl;
> }
> 
> //testOutput:
>     
> void TestOutput(int m, int n, int index)
> {
>     int i, j, k;
>     for(i = 0; i < m; i++){
>         for(j = 0; j < n; j++)
>             cout << "+---";
>         cout << "+" << endl;
>         for(k = 0; k < 3; k++){
>             for(j = 0; j < n; j++){
>                 if(TTest[index][i][j] == -1){
>                     cout << "|   ";
>                 }
>                 else{
>                     cout << "|" << Temp[TTest[index][i][j]][k][0]<<Temp[TTest[index][i][j]][k][1]<<Temp[TTest[index][i][j]][k][2];
>                     
>                 }
>             }
>             cout << "|" << endl;
>         }
>     }
>     for(j = 0; j < n; j++)
>         cout << "+---";
>     cout << "+" << endl;
> }

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator