指定起点的网格顺时针螺旋遍历:输出单元访问坐标序列
螺旋路径遍历网格问题
问题描述
给定一个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
相关产品推荐
相关产品推荐

