MyCode:
#include <iostream>
using namespace std;
const int N = 50;
int mat[N][N];
void disp(){
for(int i = 0; i < 25; i ++)
{
for(int j = 0; j < 25; j ++)
cout << mat[i][j]<<" ";
cout << endl;
}
}
void cal(){
mat[0][0] = 1;
int num = 1;
int dy[2] = {1, -1}, dx[2] = {-1, 1};
bool fg = 1; // 默认向右拐为1
for(int i = 1; i < 45; i ++)
{
fg = (i % 2 == 0) ? 0 : 1; // 奇数第一步先向右走一步,然后斜向坐下走
int st_x, st_y;
if(fg == 1) st_x = 0, st_y = i;
else st_x = i, st_y = 0;
mat[st_x][st_y] = ++ num;
for(int j = 0; j < i; j ++)
{
st_x += dx[fg], st_y += dy[fg];
mat[st_x][st_y] = ++ num;
}
}
cout << mat[19][19];
}
int main()
{
// disp();
cal();
return 0;
}
本题的一个数学规律:
其他优秀代码:
#include<bits/stdc++.h>
using namespace std;
int mp[200][200], row = 0, col = 0, cnt = 1;
int main() {
mp[0][0] = 1;
while(!mp[19][19]) {
//右移
mp[row][++col] = ++cnt;
//左下方
while(col) {
mp[++row][--col] = ++cnt;
}
//下移
mp[++row][col] = ++cnt;
//右上方
while(row) {
mp[--row][++col] = ++cnt;
}
}
cout << mp[19][19];
return 0;
}