null • 2年前
using namespace std; int main(){
int N[100][100]={};
int n;
cin>>n;
int k = 1,m=n;
int i,j;//i是行,j是列
while(k<=n*n){
//n的记录m
//先消竖排 x不变,y增加---
//规律
// j= 5,i从1-5,也就是最后结果i是6
// j = 4,i从2-4
// j= 3,i从3-3 规律总结:j从m开始,i和j的和等于n+1,结束条件 i==j
//思路总结:1.找到数字规律,根据i,j来查找规律,
//2.通过i,j的初值及变化情况,总结出循环的初始条件、结束条件
//3.构造时注意m会动态变化,所以总结饿规律一定要是不变的
for(j = m,i=n+1-j;i<=j;){
N[i++][j]=k;
k++;
}
//先消横排 y不变,x减少---
//规律
// i= 5,j从4-1
// i = 4,j从3-2
//规律总结:i从m开始,j=i-1,结束条件 i+j=n+1
for(i=m,j=i-1;i+j>=n+1;){
N[i][j--]=k;
k++;
}
//在消竖排
//x不变,y++
// j= 1,i从4-1,i最终结果是0
// j = 2,i从3-2
//规律总结:i从m-1开始,i+j=n,结束条件 i>=j
for(i=m-1,j=n-i;i>=j;){
N[i--][j]=k;
k++;
}
//在消横排
// y不变,x++
// i = 1,j从2-4
// i = 2,j从3
//规律总结:i比上面多1,j=i+1,结束条件 i+j=n
for(i=i+1,j=i+1;i+j<=n;){
N[i][j++]=k;
k++;
}
m--;
}
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
printf("%2d%s",N[i][j]," ");//注意两个数中间有空格隔开
}
cout<<endl;
}
return 0;
}
评论:
请先登录,才能进行评论