让本蒟蒻直接上代码吧,找了一下规律就找到的,代码算比较简洁了吧……
之前的数组开了两倍空间,来了个大佬@一颗橘子指点了下,想想不需要开两倍也行。
下方为大佬指点后修改之后的代码。
#include <iostream>
using namespace std;
const int N = 510;
int a[N][N];
int main(){
ios::sync_with_stdio(false);cin.tie(0);
int n;
cin >> n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin >> a[i][j];
int x = 0, y = 0;
bool flag = true;//方向一:ture就x--,y++。方向二:false就x++,y--。
while(x != n || y != n){
//关于这里为什么需要特判,主要是因为,x和y都有可能大于边界n。
//(如果还是不清楚的话可以拿我代码模拟下,可以试着删掉下方的if,然后拿例子去调试下)
if(x < n && y < n)
cout << a[x][y] << ' ';
if(flag) x--, y++;
else x++, y--;
if(x < 0) {
x = 0;
flag = !flag;//x < 0 说明x坐标越界了,把x纠正过来,然后让flag置反
}
if(y < 0){
y = 0;
flag = !flag;//y < 0 说明y坐标越界了,把y纠正过来,然后让flag置反
}
}
return 0;
}
以下是没有注释的代码
#include <iostream>
using namespace std;
const int N = 510;
int a[N][N];
int main(){
ios::sync_with_stdio(false);cin.tie(0);
int n;
cin >> n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin >> a[i][j];
int x = 0, y = 0;
bool flag = true;
while(x != n || y != n){
if(x < n && y < n)
cout << a[x][y] << ' ';
if(flag) x--, y++;
else x++, y--;
if(x < 0) {
x = 0;
flag = !flag;
}
if(y < 0){
y = 0;
flag = !flag;
}
}
return 0;
}
很巧妙的方法
改为&&为什么输出的数就会变少啊
while(x != n || y != n) 请问这个判断是为什么?x或y难道有一个能取到n吗
我调试了一下,发现当这个遍历的方向沿着斜对角线走的时候,是会出现x或者y等于n的情况的
方法很巧妙,可就是想不到呜呜呜
但不开两倍空间也可以
哈哈,我之前因为没加if(x < n && y < n)这个判断所以开了两倍,后面也没多想了哈哈。
多谢大佬指点,学习了,我现在去修改。
噢谢谢大佬 =w=