4 条题解

  • 4
    @ 2023-11-15 17:04:18

    介绍一种递归写法

    #include<stdio.h>
    
    int n, cnt;
    int a[105][105], vis[105][105];
    
    int check(int x, int y)
    {
    	if(x < 1 || x > n || y < 1 || y > n) return 0;//看是否越界(出地图) 
    	else if(vis[x][y]) return 0; //判断是否走过 
    	else return 1; //能走 
    }
    
    void dfs(int x, int y, int dirt)
    {
    	a[x][y] = ++cnt;
    	vis[x][y] = 1;//标记这个点是否走过 
    	
    	while(1) //因为要四个方向轮流转,所以是一个周期。 
    	{
    		if(cnt == n * n) return ; //当填满n * n结束 
    			
    		if(dirt % 4 == 0) //第一次往下 
    		{
    			if(check(x + 1, y)) dfs(x + 1, y, dirt);
    			else dirt++; //直到下边没地方走 
    		}
    		
    		if(dirt % 4 == 1) 
    		{
    			if(check(x, y - 1)) dfs(x, y - 1, dirt);//第二次往左 
    			else dirt++;
    		}
    		
    		if(dirt % 4 == 2) //第三次往上 
    		{
    			if(check(x - 1, y)) dfs(x - 1, y, dirt);
    			else dirt++;
    		}
    		
    		if(dirt % 4 == 3) //第四次往右 
    		{
    			if(check(x, y + 1)) dfs(x, y + 1, dirt);
    			else dirt++;
    		}
    	}
    	
    }
    
    int main()
    {
    	scanf("%d",&n);
    	dfs(1, n, 0);//由题目看出起点在(1, n),第三个量存的是方向 
    	
    	for(int i = 1; i <= n; i++)
    	{
    		for(int j = 1; j <= n; j++)
    		{
    			printf("%d ",a[i][j]);
    		}
    		printf("\n");
    	}
    	
    	return 0;
    }
    
    • 1
      @ 2023-10-15 23:51:34
      #include<stdio.h>
      int main()
      {
      	int n;
      	scanf("%d",&n);
      	int nn=n*n;
      	int x=1,y=n;
      	int fx=0;
      	int num[101][101]={0};
      	for(int i=1;i<=nn;i++){
      		num[x][y]=i;
      		if(fx==0){               //下
      			if(x+1>n||num[x+1][y]!=0){ //提前预判下一位越界或者碰头  
      				fx=1;//改变方向
      				y--;
      			}
      			else{
      				x++;
      			}
      		}
      		else if(fx==1){          //左
      			if(y-1<1||num[x][y-1]!=0){
      				fx=2;//改变方向
      				x--;
      			}
      			else{
      				y--;
      			}
      		}
      		else if(fx==2){          //上
      			if(x-1<1||num[x-1][y]!=0){
      				fx=3;//改变方向
      				y++;
      			}
      			else{
      				x--;
      			}
      		}
      		else if(fx==3){          //右
      			if(num[x][y+1]!=0){
      				fx=0;//改变方向
      				x++;
      			}
      			else{
      				y++;
      			}
      		}
      	}
      	for(int i=1;i<=n;i++){
        		for(int j=1;j<=n;j++){
      			printf("%d ",num[i][j]);
      		}
      		printf("\n");
      	}
      	return 0;
      }
      
      • @ 2023-11-14 20:45:25

        再补充一点奥,if里判断碰头和越界后,y和x还要变一次的原因是还需要同时判断下一次的坐标值,所以说要提前判断

      • @ 2025-1-22 19:04:10

        这个思路最简便👍 👍 👍 👍

    • 1
      @ 2023-8-27 13:09:32
      wasd = [[0, 1], [-1, 0], [0, -1], [1, 0]]#控制snake方向
      n = int(input())
      square = [[0 for _ in range(n + 1)] for __ in range(n + 1)]#创建初始矩阵,多创建一格防止outofindex
      
      def sq_print():
          #按题目格式打印最终结果
          for i in range(n):
              for j in range(n):
                  print(square[i][j], end = ' ')
              print()
      
      def sq_fill():
          x = n - 1
          y = 0#初始位置
          ctrl = 0#控制转向符
          for i in range(1, n * n + 1):
              square[y][x] = i
              x += wasd[ctrl][0]
              y += wasd[ctrl][1]
              if ((x == n - 1) and (y == n - 1)) or ((x == 0) and (y == n - 1)) or ((x == 0) and (y == 0)) or (square[y + wasd[ctrl][1]][x + wasd[ctrl][0]] != 0):
                  #当snake触及矩阵底部,或snake将要前往的下一个位置已经有数字的时候,控制转向
                  ctrl += 1
                  ctrl %= 4#控制符应该是{0,1,2,3},即模4的循环群
      
      sq_fill()
      sq_print()
      
      • 0
        @ 2023-8-15 17:35:18

        #include<stdio.h> int main() { int a,b,c,d,n,sum=1; int yi[101][101]; scanf("%d",&n); for(a=0;a<=(n-1)/2;a++) { for(b=a;b<=n-a-1;b++) yi[b][n-a-1]=sum++; for(b=n-2-a;b>=a;b--) yi[n-a-1][b]=sum++; for(b=n-a-2;b>=a;b--) yi[b][a]=sum++; for(b=a+1;b<n-a-1;b++) yi[a][b]=sum++; } for(c=0;c<n;c++) { for(d=0;d<n;d++) printf("%d ",yi[c][d]); printf("\n"); } }

        • 1

        信息

        ID
        131
        时间
        3000ms
        内存
        128MiB
        难度
        6
        标签
        (无)
        递交数
        541
        已通过
        179
        上传者