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

烦糙 可以帮我看看代码吗?不知道该怎么改了 :(

Posted by littlelotus at 2005-08-04 11:17:43 on Problem 2523
In Reply To:两种理解结果等价,因为一个块的转动会造成路径的不同,除非最后一个块。 Posted by:zhucheng at 2005-08-04 10:58:17
#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