偶数用的偏移量 基数用的曼哈顿
调试了半天做出来的 复习时值得再做一遍 熟悉一下
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
using ll = long long int;
int main()
{
int n ;
cin >> n;
//cout << n;
//int n = 3;
int res[100][100]={};
if(n%2==0)
{
int cx = (n-1)/2,cy = (n-1)/2;
//cout << cx << ' '<<cy;
int dx[4]= {1,0,-1,0} , dy[4]={0,1,0,-1};//移动
for(int i = 1 ,k = 0,x = cx , y = cy; i <= n * n ; i++)// i 放置的数
{
res[y][x] = i;
int tx = x + dx[k] , ty = y +dy[k]; //偏移量检验
// cout << tx << '!'<< ty;
// break;
if(tx>n-1 || ty > n-1 ||tx<0||ty<0 ||res[ty][tx]!=0)
{
k = (k-1+4)%4;
}
x = x + dx[k];
y = y + dy[k];
k = (k+1)%4;
}
}
else{
int cx = (n-1)/2,cy = (n-1)/2;
res[cy][cx]=(n*n+1)/2;
//cout << res[cy][cy];
int oushu = 2 , jishu = 1;
for(int x = 0 ; x < n ; x++)
{
for(int y = 0 ; y < n; y++)
{
if(x == cx && y == cy ) continue;
if((abs(x-cx)+abs(y-cy)) % 2 != 0)
{
res[y][x] = oushu;
oushu += 2;
}
if((abs(x-cx)+abs(y-cy)) % 2 == 0){
res[y][x] = jishu;
jishu += 2;
if(jishu == (n*n+1)/2) jishu += 2;
}
}
}
}
for(int i = 0 ; i <n;i++)
{
for(int j =0 ; j <n ; j++)
cout << res[i][j]<<' ';
cout <<endl;
}
return 0;
}
基数时 直接顺序赋值也能满足
基数时
else{
int h = 1;
for(int i = 0; i < n ; i++)
{
for(int j = 0 ; j < n ; j++)
{
res[i][j]= h;
h++;
}
}
}
奇数和偶数都可以用对角线交叉替换的方法
也可以理解为每一行大头的分别是奇数和偶数 后面紧随的交替
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
using ll = long long int;
int main()
{
int n ;
cin >> n;
int jishu = 1;
int oushu = 2;
int res[100][100]={};
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < n ; j++)
{
if((j+i)%2==0) //通过坐标能否被2整除 来达到交替的目的
{
res[i][j]=jishu;
jishu += 2;
}
else
{
res[i][j]=oushu;
oushu += 2;
}
}
}
for(int i = 0 ; i <n;i++)
{
for(int j =0 ; j <n ; j++)
cout << res[i][j]<<' ';
cout <<endl;
}
return 0;
}
https://ac.nowcoder.com/acm/contest/95700/B