Niuke National Day day8 Easy Chess(構造)

リンク:https
//ac.nowcoder.com/acm/contest/7865/A出典:Niuke.com

エルマはチェスの駒を学んでいます。
彼女は、ルークが水平または垂直に動くことができることを学びました。ルークの動きについての理解を深めるために、エルマの祖母はエルマに8×8のチェス盤を渡し、ルークをa1からh8に正確にn回動かす方法を見つけて、訪問したすべてのセルが異なるようにするように依頼しました。
訪問したセルは、最初のセルa1と、移動後にルークが着地する各セルです。入力
インポート述:
入力には、単一の整数n(
2≤n≤63 )—必要な移動数が含まれます。未出ダウンロード:
スペースを出力します。 -n + 1の訪問済みセルを、ルークが訪問した順序で分離したリスト。すべてのセルが異なっている必要があります。リストはa1で始まり、h8で終わる必要があります。解決策は常に存在します。
示例1
輸入
入复制
4
出力
コピー
a1f1 c1 c8 h8

質問の意味:
水平または垂直(車)で歩くことができ、n個の正方形を繰り返し、そして最後まで横断しないことが必要です。

アイデア:
2〜50の部分は(1,1)から(7,7)の
51〜56の部分に移動でき、最初に(1,1)から(7,7)に移動し、次に(8,7)に移動できます)n-48-1グリッドを順番に歩き、最後まで歩きます。
57から63まで、グリッドを(1,1)から(5,8)まで順番にトラバースし、次に(5,8)から(7,8)までトラバースします。これは56ステップを通過します。次に、最後の行の残りのグリッドをトラバースします。

#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;
}

おすすめ

転載: blog.csdn.net/tomjobs/article/details/108999035