3 条题解

  • 0
    @ 2026-2-1 10:21:24
    #include<bits/stdc++.h>
    using namespace std;
    int a[50][50];
    int dx[]={0,1,0,-1};
    int dy[]={1,0,-1,0};
    int main()
    {
    	memset(a,0,sizeof a);
    	int n;scanf("%d",&n);
    	int x=1,y=1,t=2,d=0;a[1][1]=1;
    	while(t<n*n)
    	{
    		int xx=x+dx[d],yy=y+dy[d];
    		if(xx>0&&xx<=n&&yy>0&&yy<=n&&a[xx][yy]==0)
    		{
    			a[xx][yy]=t;
    			x=xx;y=yy;
    		}
    		else
    		{
    			d=(d+1)%4;
    			x+=dx[d];y+=dy[d];
    			a[x][y]=t;
    		}
    		t++;
    	}
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			if(a[i][j]==0)printf("T ");
    			else printf("%d ",a[i][j]);
    		}
    		puts("");
    	}
    	return 0;
    }
    
    • -1
      @ 2026-2-1 14:40:49

      就是螺旋矩阵把最后一个数字改为字符T, 不懂的看这个:

      P1029

      再改一下旋转方向

      #include<bits/stdc++.h>
      using namespace std;
      int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};//移动过程 
      int a[50][50];
      int main()
      {
      	int n;scanf("%d",&n);
      	a[1][1]=1;
      	int x=1,y=1,t=0,k=2;
      	while(k<n*n)
      	{
      		if(a[x+dx[t]][y+dy[t]]||x+dx[t]>n||x+dx[t]<1||y+dy[t]>n||y+dy[t]<1)t=(t+1)%4;
      		x+=dx[t];
      		y+=dy[t];
      		a[x][y]=k;
      		k++;
      	}//螺旋矩阵:注意不能k<=n*n,因为正中间是头T
      	for(int i=1;i<=n;i++)
      	{
      		for(int j=1;j<=n;j++)
      		{
      			if(a[i][j])printf("%d ",a[i][j]);//有数字就不是龙头 
      			else printf("T ");//未填就是龙头了 
      		}
      		puts("");
      	}
      	return 0;
      }
      
      
      • -1
        @ 2026-2-1 11:00:36

        回型矩阵,一直绕圈圈就可以到达中间(其实分析样例也行)

        #include<bits/stdc++.h>
        using namespace std;
        int dx[4]={0,1,0,-1};//四种方向要按照这个顺序 
        int dy[4]={1,0,-1,0};
        const int N=50;
        int a[N][N];
        int main()
        {
        	int n;
        	scanf("%d",&n);
        	int x=1,y=1,k=0,fx=0;
        	while(k<n*n)//每一个点 
        	{
        		a[x][y]=++k;//赋值 
        		if(x+dx[fx]<1||x+dx[fx]>n||y+dy[fx]<1||y+dy[fx]>n||a[x+dx[fx]][y+dy[fx]])fx=(fx+1)%4;//如果要转向(碰到边缘) 
        		x+=dx[fx],y+=dy[fx];//移动 
        	}
        	for(int i=1;i<=n;i++)
        	{
        		for(int j=1;j<=n;j++)
        		{
        			if(i!=(n+1)/2||j!=(n+1)/2)printf("%d ",a[i][j]);
        			else putchar('T'),putchar(' ');//到达了正中间 
        		}
        		puts("");
        	}
        	return 0;//完结撒花 
        }
        
        • 1

        信息

        ID
        8265
        时间
        2000ms
        内存
        1024MiB
        难度
        5
        标签
        递交数
        20
        已通过
        13
        上传者