[2016-01-21][POJ][2488]

[2016-01-21][POJ][2488]

  • /*************************************************************
  • 时间:2016-01-20  15:57:04  星期三
  • 题目编号:POJ 2488
  • 题目大意:给一个棋盘和旗子'马',问马是否能一次把所有格子走一遍,如果可以输出路径,否则输出impossible
  • 方法:
    • dfs,dfs返回的过程保存路径
  • 解题过程遇到问题:
    • dfs开始前 ,vis设置为1,结束前,vis恢复为0
    • dfs 可以通过返回值 1,0 来判断此次路径是否找到
    • 输出有一个空行!!!,要换两行
  • *************************************************************/  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
int p,q;
string path = "";
int vis[27][27];
int dx[] = {-1,1,-2,2,-2,2,-1,1};
int dy[] = {-2,-2,-1,-1,1,1,2,2};
 
int dfs(int x,int y,int tt) // x,y表示当前坐标,tt表示已经走过的点的数目
{
    vis[x][y]  = 1;
    if(tt == p*q){
        return 1;
    }
    for(int i = 0;i < 8;i++){
        int tx = x + dx[i];
        int ty = y + dy[i];
 
        if(tx >= 0 && ty >= 0 && tx < p && ty < q )
            if(!vis[tx][ty] ){
                if(dfs(tx,ty,tt+1)){
                    path += '1' + tx;
                    path += 'A' + ty;
                    return 1;
                }
            }
    }
    vis[x][y] = 0;
    return 0;
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int i = 1;i <= t;i++)
    {
        scanf("%d%d",&p,&q);
        memset(vis,0,sizeof(vis));
 
        path = "";
        if (dfs(0,0,1)){
            path += '1';
            path += 'A';
        }
 
        reverse(path.begin(),path.end());
        printf("Scenario #%d:\n",i);
        if(path == "")
            printf("impossible\n\n");
        else printf("%s\n\n",path.data());
    }
    return 0;
}






来自为知笔记(Wiz)


posted on 2016-01-21 21:58  红洋  阅读(133)  评论(0)    收藏  举报

导航