You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指定起点的网格顺时针螺旋遍历:输出单元访问坐标序列

螺旋路径遍历网格问题

问题描述

给定一个rows行cols列的零索引网格,西北角落为(0,0),东南角落为(rows−1,cols−1)。从单元格(rStart,cStart)出发,初始朝向东方,沿顺时针螺旋路径行走——即使走出网格边界也继续移动,后续可返回网格。需要找出所有网格单元的访问顺序,确保每个单元仅被访问一次,最终输出按访问顺序排列的坐标二维数组。

输入参数

Integer rows: 网格的行数(1 ≤ rows ≤ 100)
Integer cols: 网格的列数(1 ≤ cols ≤ 100)
Integer rStart: 起始行索引(0 ≤ rStart < rows)
Integer cStart: 起始列索引(0 ≤ cStart < cols)

输出要求

一个二维坐标数组,每个内部数组为[r,c],代表被访问的单元格的行和列,外部数组按访问顺序排列这些坐标。

约束条件

1 <= rows, cols <= 100
0 <= rStart < rows
0 <= cStart < cols

样例

样例1

输入:1 4 0 0
输出:[[0,0],[0,1],[0,2],[0,3]]

样例2

输入:5 6 1 4
输出:[[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],[0,5],[3,5],[3,4],[3,3],[3,2],[2,2],[1,2],[0,2],[4,5],[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1],[0,1],[4,0],[3,0],[2,0],[1,0],[0,0]]

尝试的代码

int main() {

    
    int rStart, cStart, rows, columns;
    scanf("%d %d %d %d", &rows, &columns, &rStart, &cStart);
    int right = 1, left = -1, up = -1, down = 1;
    int counter = rows*columns ;
    
    printf("%d %d", rStart, cStart);
    rStart --;
    cStart--;
    
    while(counter>0){
    
        int temp1 = cStart;
        cStart = cStart + right;
        
        right = right + 2;
        while(rStart<rows && (rStart>0) && cStart<columns && cStart >0 && temp1<=cStart){
            printf("%d %d", rStart, temp1++);
            counter--;
            if(counter == 0) break;
        }
        int temp2 = rStart;
        rStart = rStart + down;
        
        down = down + 2;
        while(cStart<columns && rStart<columns &&cStart > 0 && rStart >0 && temp2<=rStart){
            printf("%d %d", temp2++, cStart);
            counter--;
            if(counter == 0) break;
        }
        temp1 = cStart;
        cStart = cStart + left;
        left = left - 2;
        while(cStart<columns && rStart<columns &&cStart > 0 && rStart >0 && temp1>=cStart){
            printf("%d %d", rStart, temp1--);
            counter--;
            if(counter == 0) break;
        }
        temp2 = rStart;
        rStart = rStart + up;
        up = up - 2;
        while(cStart<columns && rStart<columns &&cStart > 0 && rStart >0 && temp2>=rStart){
            printf("%d %d", rStart, temp2--);
            counter--;
            if(counter == 0) break;
        }
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Vijna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:24:58