You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
3.4 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
//*************************************************************************
/*
˼·<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>Ե<EFBFBD><EFBFBD>Ҫת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>0
<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>Ҫ<EFBFBD>ߵ<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD>߹<EFBFBD><EFBFBD>ˣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD>x,y<EFBFBD>ļӼӼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵλ<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD>
*/
// <20>ϣ<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD>ң<EFBFBD>4
const int UP = 1, DOWN = 2, LEFT = 3, RIGHT = 4;
//˳ʱ<CBB3><CAB1>
int dirSun[4] = {RIGHT, DOWN, LEFT, UP};
//<2F><>ʱ<EFBFBD><CAB1>
int dirNi[4] = {RIGHT, UP, LEFT, DOWN};
//<2F><><EFBFBD><EFBFBD>
int a[10][10] = {0};
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ8*8
int n = 4;
//<2F><>ʼ<EFBFBD><CABC>
int x = 0, y = 0;
//<2F><>ʼʱ<CABC>ķ<EFBFBD><C4B7><EFBFBD>
int dir = RIGHT;
//<2F><>һ<EFBFBD><D2BB>λ<EFBFBD>ñ<EFBFBD>ʶ<EFBFBD><CAB6>
int step = 1;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
bool UpStep() {
if (x - 1 >= 0 && a[x - 1][y] == 0) {
a[--x][y] = ++step;
return true;
}
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
bool DownStep() {
if (x + 1 < n && a[x + 1][y] == 0) {
a[++x][y] = ++step;
return true;
}
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
bool RightStep() {
if (y + 1 < n && a[x][y + 1] == 0) {
a[x][++y] = ++step;
return true;
}
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
bool LeftStep() {
if (y - 1 >= 0 && a[x][y - 1] == 0) {
a[x][--y] = ++step;
return true;
}
return false;
}
//<2F><>ȡ<EFBFBD><C8A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Եķ<D4B5><C4B7><EFBFBD>
int NextDir(int turn) {
//<2F><>Ҫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD>˳ʱ<CBB3><EFBFBD><EBBBB9><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EBA3AC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD>ͬ<EFBFBD><CDAC>
if (turn == 1) { //˳ʱ<CBB3><CAB1>
for (int i = 0; i < 4; ++i) {
if (dirSun[i] == dir) {
return dirSun[i + 1 == 4 ? 0 : i + 1];
}
}
} else { //<2F><>ʱ<EFBFBD><CAB1>
for (int i = 0; i < 4; ++i) {
if (dirNi[i] == dir) {
return dirNi[i + 1 == 4 ? 0 : i + 1];
}
}
}
return -1;
}
//<2F>˹<EFBFBD><CBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ҳ<EFBFBD>Ǻ<EFBFBD><C7BA>ĵ<EFBFBD>˼·
bool autoStep(int turn) { //turn:<3A><>˳ʱ<CBB3><CAB1>:1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>:2
bool success;
int tryCount = 0;
while (tryCount < 4) {
//1<><31><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
switch (dir) {
case UP:
success = UpStep();
if (success) return true;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dir = NextDir(turn);
break;
case DOWN:
success = DownStep();
if (success) return true;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dir = NextDir(turn);
break;
case RIGHT:
success = RightStep();
if (success) return true;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dir = NextDir(turn);
break;
case LEFT:
success = LeftStep();
if (success) return true;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dir = NextDir(turn);
break;
}
tryCount++;
}
return false;
}
void helixMatrix() {
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼Ϊ<C2BC><CEAA>һ<EFBFBD><D2BB>
a[x][y] = 1;
//<2F><>ִ<EFBFBD><D6B4>n*n<>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊֹ<CEAA><D6B9>
while (step < n * n) {
//ģ<><C4A3>˳ʱ<CBB3><CAB1>
bool success = autoStep(2);
if (!success) {
cout << "<EFBFBD>޷<EFBFBD><EFBFBD>ߵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>" << endl;
break;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cout << setw(2) << a[i][j] << " ";
}
cout << endl;
}
}
int main() {
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
helixMatrix();
return 0;
}