int x, y, d; int i, j, nx, ny; // 将二维数组全部初始化为-1,-1用来判断当前位置是否已经走过 for (i = 0; i < n; ++i) { for (j = 0; j < n; ++j) { res[i][j] = -1; } }
x = 0; y = 0; d = 0; //i在这个时候相当于每个位置应该放的数字 for (i = 1; i <= n * n; ++i) { //当前位置放置i res[x][y] = i; //计算下一个的x,y坐标. 计算方法为:x+增量,增量由当前的方向决定 nx = x + dx[d]; ny = y + dy[d];
//判断下一步的x,y坐标是否有问题,包括:四种越界和该位置已经走过了 if (nx < 0 || nx >= n || ny < 0 || ny >= n || res[nx][ny] != -1) { //如果下一步有问题,转向,转向方法为:(d+1)%4,这样可以按照右下左上的顺序来旋转 d = (d + 1) % 4; //方向改变,增量改变,重新计算新的下一步坐标 nx = x + dx[d]; ny = y + dy[d]; } //走下一步 x = nx; y = ny; } //返回. return res; }