输入一个棋盘 ( p × q ),从任意点开始,每次走日子格,求能走遍每个点的序列,以Sample中给出的样式按字典序输出,如果得不到这样的序列输出impossible

由于要按字典序输出,所以优先访问坐标较小的点,第一次得到的序列就是所求结果

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
 
using namespace std;
 
int const maxn = 30;
 
bool vis[maxn][maxn];
int p, q;
bool flag = false;
 
int const steps[8][2= { { -1-2 }, { 1-2 }, { -2-1 }, { 2-1 }, { -21 }, { 21 }, { -12 }, { 12 } };
 
typedef struct node
{
    int x;
    int y;
}coordinate;
 
bool judge()
{
    forint i = 0; i < p; i++ )
        forint j = 0; j < q; j++ )
            if!vis[i][j] )
                return false;
    return true;
}
 
vector<coordinate> path;
 
void dfs( int x, int y )
{
    if( flag )
        return;
    if( judge() && !flag ) {
        printf( "A1" );
        forint i = 0; i < path.size(); i++ ){
            printf( "%c", path[i].y + 65 );
            printf( "%d", path[i].x + 1 );
        }
        puts("");
        flag = true;
        return;
    }
    forint i = 0; i < 8; i++ ) {
        int next_x = x + steps[i][0];
        int next_y = y + steps[i][1];
        if( next_x >= 0 && next_x < p && next_y >= 0 && next_y < q && !vis[next_x][next_y] ) {
            coordinate tmp;
            tmp.x = next_x;
            tmp.y = next_y;
 
            path.push_back( tmp );
            vis[next_x][next_y] = 1;
 
            dfs( next_x, next_y );
 
            vis[next_x][next_y] = 0;
            path.pop_back();
        }
    }
 }
 
int main()
{
    int n; scanf( "%d"&n );
 
    forint i = 0; i < n; i++ ) {
        scanf( "%d%d"&p, &q );
 
        flag = false;
 
        printf( "Scenario #%d:\n", i + 1 );
 
        memset( vis, 0sizeof( vis ) );
 
        path.clear();
        vis[0][0= 1;
        dfs( 00 );
        if!flag )
            printf( "impossible\n" );
        puts("");
 
    }
    return 0;
}
posted on 2016-08-31 10:16 Vontroy 阅读(159) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理