| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
起始点状态不能为Temp[2],结束点状态不能为Temp[0],加一个判断就行了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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator