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;
    }
    

    信息

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