A Knight's Journey

GitHub跳转原题关系图返回列表

题意与原解析均从本地 OpenJudge 缓存迁移。

OJ: noi_openjudge

题目 ID: ch0205-1490

难度:未知

标签:

日期: 2026-07-30 23:01

题意

完整题面见同目录的 problem.md

思路

代码

cpp
#include <bits/stdc++.h>
using namespace std;

bool vis[105][105];

struct pos {
    int x,y;
};
int p,q;
pos sta[10005];

int dx[8]= {-1,1,-2,2,-2,2,-1,1};
int dy[8]= {-2,-2,-1,-1,1,1,2,2};
int fx[8][2];

void init(){
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&p,&q);
}

bool in_map(int x,int y){
    if( x >=1 && x <= p && y >=1 && y <=q)
        return 1;
    return 0;
}

bool dfs(int x,int y,int dep){
    vis[x][y] = 1;
    sta[dep] = {x,y};
    if( dep == p*q) {
        return 1;
    }
    
    int i;
    for (i=0;i<8;i++){
        int nx = x + fx[i][0];
        int ny = y + fx[i][1];
        if(in_map(nx,ny) && !vis[nx][ny]){
            if( dfs(nx,ny,dep+1))
                return 1;
            vis[nx][ny] = 0;
        }
    }
    return 0;
}

int main(){
    int T;
    int cnt = 0;
    scanf("%d",&T);
    int i,j,k;
    for( i = 0;i< 8;i++){
        fx[i][0] = dx[i];
        fx[i][1] = dy[i];
    }
    while (T--) {
        printf("Scenario #%d:\n",++cnt);
        init();
        bool flag = false;
        for (i=1;i<=p;i++){
            for (j=1;j<=q;j++){
                memset(vis,0,sizeof(vis));
                if( dfs(i,j,1)){
                    for(k = 1;k<=p*q;k++){
                        printf("%c%d",sta[k].y+'A'-1,sta[k].x);
                    }
                    printf("\n");
                    flag = true;
                    break;
                }
            }
            if( flag) break;
        }
        if( !flag)
            printf("impossible\n");
        if( T != 0)
            printf("\n");
    }
    return 0;
}

复杂度

总结