リンク: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;
}