Día Nacional de Niuke day8 Easy Chess (estructura)

Enlace: https://ac.nowcoder.com/acm/contest/7865/A
Fuente: Niuke.com

Elma está aprendiendo figuras de ajedrez.
Aprendió que una torre se puede mover tanto horizontal como verticalmente. Para mejorar su comprensión del movimiento de la torre, la abuela de Elma le dio a Elma un tablero de ajedrez de 8 × 8 y le pidió que encontrara una manera de mover la torre de a1 a h8 haciendo exactamente n movimientos, de modo que todas las celdas visitadas fueran diferentes.
Una celda visitada es la celda inicial a1 y cada celda en la que cae la torre después de un movimiento.
输入 描述:
La entrada contiene un solo entero n (2 ≤ n ≤ 63) - el número deseado de movimientos.
输出 描述:
Salida un espacio -Lista separada de n + 1 celdas visitadas en el orden en que son visitadas por la torre. Todas las celdas deben ser diferentes. La lista debe comenzar con a1 y terminar con h8. Siempre existe una solución.
示例 1
输入
复制
4

Copia de salida
a1 f1 c1 c8 h8

Pregunta:
Puede caminar horizontal o verticalmente (automóvil), y se requiere no atravesar n cuadrados repetidamente, y finalmente hasta el final.

Idea: La parte
2 ~ 50 puede ir de (1,1) a (7,7) la parte
51 ~ 56, primero ir de (1,1) a (7,7) y luego de (8,7) ) Camine por las cuadrículas n-48-1 a su vez, y luego camine hasta el final.
De 57 a 63, atraviese las cuadrículas de (1,1) a (5,8) a su vez, y luego atraviese de (5,8) a (7,8). Este atraviesa 56 pasos. Luego recorre las cuadrículas restantes en la última línea.

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>

using namespace std;

const int INF = 0x3f3f3f3f;
const int maxn = 5005;
const int mod = 1e9 + 7;

vector<pair<int,int> >ans;

int get1(int n) {
    
     //弄到前x步, 3~51
    int cnt = 0;
    int x = 1,y = 1;
    for(int i = 1;i <= 7;i++) {
    
    
        if(i & 1) {
    
    
            for(int j = 1;j <= 7;j++) {
    
    
                cnt++;
                if(cnt > n) break;
                ans.push_back({
    
    i,j});
                x = i;y = j;
            }
        } else {
    
    
            for(int j = 7;j >= 1;j--) {
    
    
                cnt++;
                if(cnt > n) break;
                ans.push_back({
    
    i,j});
                x = i;y = j;
            }
        }
        if(cnt > n) break;
    }
    return y;
}

void get2(int n) {
    
     //52~57
    get1(49);
    n -= 49;
    n--;
    for(int i = 7;i >= 7 - n + 1;i--) {
    
    
        ans.push_back({
    
    i,8});
    }
    ans.push_back({
    
    8,8});
}

void get3(int n) {
    
     //58~64
    for(int i = 1;i <= 5;i++) {
    
    
        if(i & 1) {
    
    
            for(int j = 1;j <= 8;j++) {
    
    
                ans.push_back({
    
    i,j});
            }
        } else {
    
    
            for(int j = 8;j >= 1;j--) {
    
    
                ans.push_back({
    
    i,j});
            }
        }
    }
    int x = 5,y = 8;
    for(int i = 1;i <= 8;i++) {
    
    
        if(i & 1) {
    
    
            ans.push_back({
    
    ++x,y});
            ans.push_back({
    
    ++x,y});
        } else {
    
    
            ans.push_back({
    
    x--,y});
            ans.push_back({
    
    x--,y});
        }
        y--;
    }
    n -= 56;
    n--;
    for(int i = 1;i <= n;i++) {
    
    
        ans.push_back({
    
    8,i});
    }
    ans.push_back({
    
    8,8});
}

void Print() {
    
    
    for(int i = 0;i < ans.size();i++) {
    
    
        printf("%c%d ",ans[i].second - 1 + 'a',ans[i].first);
    }
}

int main() {
    
    
    int n;scanf("%d",&n);
    n++;
    if(n <= 51) {
    
    
        int y = get1(n - 2);
        ans.push_back({
    
    8,y});
        ans.push_back({
    
    8,8});
    } else if(n <= 57) {
    
    
        get2(n);
    } else {
    
    
        get3(n);
    }
    Print();
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/tomjobs/article/details/108999035
Recomendado
Clasificación