解题思路
方法一:铁头模拟题目中那个路线的规律,记录上一步是怎么走的,判断下一步该如何走(例如:上一步是横,下一步是左上或右下;上一步是左下,下一步是左下或下或横)用if判断下一步该如何走,这种方法我试过,可解,只是稍微有些繁琐
方法二:寻找更一般的规律
以4 x 4的矩阵为例
- 首先将矩阵左边和下面补充等大矩阵不看题目中横的和向下的路线,就会发现其实就是在走对角线的格子,而且只有两种走法,一种左下,一种右上
所以得到的解法是,用一个标记flag标记当前的走法,当判断越界时,进行x = 0 / y = 0 进行调整 并更换走法,并且只有当该点在黑方格区域内才将该点输出,当走到(n, n)时结束
代码实现
#include#include #include using namespace std; const int N = 510; int n; int a[N][N]; int main() { cin >> n; for (int i = 1; i <= n; i ++) { for (int j = 1; j <= n; j ++) { cin >> a[i][j]; } } int x = 1, y = 1; bool flag = true; // flag 为true表示右上 while(x != n || y != n) //当遍历到a[n][n]时结束循环 { if(x >= 1 && x <= n && y >= 1 && y <= n) 当该点在区域内 { cout << a[x][y] << " "; } if(flag) //右上走法 { x --; y ++; } else { x ++; y --; } if(x < 1) //边界为 1~n;当x < 1时越界 { x = 1; flag = !flag; } if(y < 1) { y = 1; flag = !flag; } } cout << a[n][n]; //跳出循环后,输出最后一个数字 return 0; }



