AcWing 3208. Z字形扫描
原题链接
简单
作者:
南川嘉子
,
2024-10-03 17:41:05
,
所有人可见
,
阅读 1
//这种题感觉突破口还是找移动的方向的规律(抓主流方向然后做好边界特判)
#include<iostream>
using namespace std;
int zigscan(int a[][510],int n,int ans[]){//注意一个语法错,a[][]不对!
int row=0,col=0;//初始化行和列为0
int index=0;
bool up=true;//标记是否需要向上对角线移动
for(int i=0;i<n*n;i++){
ans[index++]=a[row][col];
//分两个主流方向
if(up){//右上对角线 其实判断是有优先级的 !!
//到既row==0又col==n-1的地方是做向下,所以col==n-1优先
if(col==n-1){//上不去了
row++;//向下
up=false;
} else if(row==0 ){
col++;//只向右 (本身是up 右上 容易右出边界)
up=false;//方向转左下
} else{
row--;
col++;
}
// 错误写法 if(row==0){//上不去了
// col++;//只向右
// up=false;//方向转左下
// } else if(col==n-1){ 这么写就是row不等于0且col=n-1
// row++;
// up=false; 到既row==0又col==n-1的地方是做向下,所以col==n-1优先
// } else{
// row--;
// col++;
// }
}else{//左下对角线 其实判断是有优先级的 到col==0且row==n-1处是向右
if(row==n-1){
col++;//向右
up=true;
} else if(col==0 ){
row++;//向下 (本身是左下 容易下出边界)
up=true;
}else{
row++;
col--;
}
}
}
}
int main(){
//ios::sync_with_stdio(false);cin.tie(0);
int n;
cin>>n;
int a[510][510];
int ans[250010];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
zigscan(a,n,ans);
for(int i=0;i<n*n;i++){
cout<<ans[i]<<' ';
}
cout<<endl;
return 0;
}
//主流方向是两个对角线方向
//然后按照对角线方向走到矩阵边界之后,做出特判
//如果向右上 上不去 就水平向右;右边也不行就要向下
//如果上左下 左不了 就垂直向下;再下不了就要向右