- 莫名其妙的传送门
- 简简单单的提高组小水题
- 大体思路就是把一堆判断往题干上套
- 其实第一眼看到感觉可以递归
(但我又懒了) - 所以循环多好啊,还能少打两行代码……
- 就是这些
1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列;
2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行;
3.若(K−1)在第一行最后一列,则将K填在(K−1)的正下方;
4.若(K−1)既不在第一行,也不在最后一列,如果(K−1)的右上方还未填数,则将K填在(K−1)的右上方,否则将K填在(K−1)的正下方。
- 其他具体见代码注释
代码
#include<bits/stdc++.h>
using namespace std;
int a[50][50];
int main()
{
int n,x,y;
scanf("%d",&n);
x=1,y=n/2+1;//y在中间(已规定n为奇数)
a[x][y]=1;
for(int i=2;i<=n*n;i++){
if(x==1&&y!=n) //第1种情况(K−1)在第一行但不在最后一列
x=n,y++;//K填在最后一行,(K−1)所在列的右一列
else if(y==n&&x!=1) //第2种情况(K−1)在最后一列但不在第一行
y=1,x--;//将K填在第一列,(K−1)所在行的上一行
else if(x==1&&y==n) //第3种情况(K−1)在第一行最后一列
x++;//将K填在(K−1)的正下方
else{//第4种情况(K−1)既不在第一行,也不在最后一列
if(!a[x-1][y+1]) //如果(K−1)的右上方还未填数
x--,y++;//将K填在(K−1)的右上方
else x++;//否则将K填在(K−1)的正下方
}
a[x][y]=i;//存储
}
for(int i=1;i<=n;i++){//输出就不说了
for(int j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
- 啊一堆注释看着好墨迹
- 干干净净的好看多了
#include<bits/stdc++.h>
using namespace std;
int a[50][50];
int main()
{
int n,x,y;
scanf("%d",&n);
x=1,y=n/2+1;
a[x][y]=1;
for(int i=2;i<=n*n;i++){
if(x==1&&y!=n) x=n,y++;
else if(y==n&&x!=1) y=1,x--;
else if(x==1&&y==n) x++;
else{
if(!a[x-1][y+1]) x--,y++;
else x++;
}
a[x][y]=i;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}