SCU 2166 A Knight's Journey

Home | Ranklist | Problems | Solutions | Contests | Discuss | Register | Login

2166: A Knight's Journey


Submit your solution     Discuss this problem     Best solutions


Background 
The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey 
around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board, but it is still rectangular. Can you help this adventurous knight to make travel plans? 

Problem 
Find a path such that the knight visits every square once. The knight can start and end on any square of the board.

Input

The input begins with a positive integer n in the first line. The following lines contain n test cases. Each test case consists of a single line with two positive integers p and q, such that 1 <= p * q <= 26. This represents a p * q chessboard, where p describes how many different square numbers 1, . . . , p exist, q describes how many different square letters exist. These are the first q letters of the Latin alphabet: A, . . .

Output

The output for every scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1. Then print a single line containing the lexicographically first path that visits all squares of the chessboard with knight moves followed by an empty line. The path should be given on a single line by concatenating the names of the visited squares. Each square name consists of a capital letter followed by a number. 
If no such path exist, you should output impossible on a single line.

Sample Input

3
1 1
2 3
4 3

Sample Output

Scenario #1:
A1

Scenario #2:
impossible

Scenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4



先发个图自嘲一下/(ㄒoㄒ)/~~真心羸弱

就先说刚开始,三个TLE,主要还是输入输出搞得,毕竟C++的输入输出的时间比较多,再加上暴力题,输出结果又多,╮(╯▽╰)╭

改完输入输出之后就开始WA,主要被坑的就是

1.对行列理解错了,把行和列弄反了/(ㄒoㄒ)/~~

2.就是字典序, lexicographically 英语不好还是坑了


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int p;
int q;
int visited[31][31];
bool flag;
char pathX[31];
int pathY[31];

/*字典序
 3    5
1      7                 
  
2      8
 4    6
*/
//1234
int dx[] = {-1,1,-2,2,-2,2,-1,1};
//ABCD
int dy[] = {-2,-2,-1,-1,1,1,2,2};


bool isSafe(int x,int y) {
    if(x >= 1 && x <= p && y >= 1 && y <= q && visited[x][y] == 0 && flag == false) {
        return true;
    }
    return false;
}

void dfs(int x,int y,int step) {
    if(flag == true) {
        return;
    }
    
    pathX[step] = x;
    pathY[step] = y + 'A' - 1;
    if(step == p * q) {
        flag = true;
        return;
    }
    
    for(int i = 0;i < 8;i++) {
        int nextX = x + dx[i];
        int nextY = y + dy[i];
        if(isSafe(nextX,nextY) == true) {
            visited[nextX][nextY] = 1;
            
            dfs(nextX,nextY,step+1);
            visited[nextX][nextY] = 0;
        }
    }
}

int main(void) {
    int n;
    int count = 1;
    
    scanf("%d",&n);
    
    while(n--) {
        flag = false;
        memset(visited,0,sizeof(visited));
        scanf("%d %d",&p,&q);
        printf("Scenario #%d:\n",count);
        visited[1][1] = 1;
        dfs(1,1,1);
        
        if(flag == false) {
            printf("%s\n","impossible");
        } else {
            for(int i = 1;i < p*q;i++) {
                printf("%c%d",pathY[i],pathX[i]);
            }
            printf("%c%d\n",pathY[p*q],pathX[p*q]);
        }

        printf("\n");

        count++;
    }
    
    return 0;
}




















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值