1 条题解

  • 0
    @ 2025-8-24 21:16:04

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Deer_Peach
    Huh?||潜水ing~||私信前请看注意事项

    搬运于2025-08-24 21:16:03,当前版本为作者最后更新于2024-03-15 19:10:48,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    纯模拟:

    第一步:

    把一填进第一行中央:

    int x=0,y=n/2;
    a[x][y]=1;
    

    第二步:

    需要变横、纵坐标:

    int tx=(x+n-1)%n;//上次填数位置横轴变化
    int ty=(y+1)%n;//上次填数位置纵轴变化
    

    第三步:

    第二步填数失败:

    tx=(x+1)%n;//上次填数位置横轴变化
    ty=y;//上次填数位置纵轴不变
    

    最后:

    结合代码:

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int a[25][25];
    int main(){
    	cin>>n;//输入
    	int x=0,y=n/2;//初始坐标
    	a[x][y]=1;//第一步操作:第一行中间填1
    	for(int cnt=2;cnt<=n*n;cnt++){//重复第二步和第三步操作
    		int tx=(x+n-1)%n;//上次填数位置横轴变化
    		int ty=(y+1)%n;//上次填数位置纵轴变化
    		if(a[tx][ty]==0){//第二步填数成功
    			a[tx][ty]=cnt;//填数
    		}else{//第二步没成功做第三步操作
    			tx=(x+1)%n;//上次填数位置横轴变化
    			ty=y;//上次填数位置纵轴不变
    			a[tx][y]=cnt;//填数
    		}
    		x=tx;//更新横轴
    		y=ty;//更新纵轴
    	}
    	for(int i=0;i<n;i++){//输出
    		for(int j=0;j<n;j++){
    			cout<<a[i][j]<<" ";
    		}
    		cout<<endl;
    	}
    	return 0;//结束
    }
    • 1

    信息

    ID
    9869
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者