Bài viết: 28 



Link bài:
Thuật toán:
Code:
Thuật toán:
- Ta bao các cạnh bên ngoài của thành bằng các phần tử mang giá trị 1.
- Tường thành là một mảng 2 chiều.
- Tạo một chương trình con để di chuyển, khi đụng trúng bờ bao 1 hoặc đụng trúng lớp tường bên ngoài, sẽ lập tức rẽ phải.
- Bài này gần tương tự bài VOXO, chỉ khác VOXO đi từ trong ra, bài này đi từ ngoài vào.
Code:
Mã:
#include<bits/stdc++.h>
using namespace std;
int n, value_moment;
int a[107][107];
void runfor(int position_x, int position_y, int direction_x, int direction_y){
int x = position_x; int y = position_y;
while (a[x+direction_x][y+direction_y] == 0){
a[x][y] = value_moment+1;
x += direction_x; y += direction_y;
value_moment++;
}
if (value_moment == n*n-1){
a[x][y] = n*n;
return;
}
runfor(x, y, -direction_y, direction_x);
}
void read(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
//freopen("CLOA.INP", "r", stdin);
//freopen("CLOA.OUT", "w", stdout);
cin >> n;
}
void run(){
for (int i = 0; i <= n+1; i++)
a[0][i] = a[i][0] = a[n+1][i] = a[i][n+1] = 1;
runfor(1, 1, 1, 0);
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++) cout << a[j][i] << " ";
cout << "\n";
}
}
int main(){
read();
run();
return 0;
}