一个for语句完成构建螺旋矩阵,谁看懂?解释下。
#include <stdio.h>
#include <string.h>
int xy[4][2] = {{1,0},{0,1},{-1,0},{0,-1}}, m[100][100] = {0};
int dfs(int x, int y, int n, int d, int i, int e)
{
for (m[y][x] = n; i < d + 4; ++i)
if (e = i % 4, m[y+xy[e][1]][x+xy[e][0]] == -1)
return dfs(x+xy[e][0], y+xy[e][1], n + 1, e, e, e);
}
int main(void)
{
int x = 5, y = 4, j;
for (j = 1; j <= y; ++j)
memset(&m[j][1], 255, x * sizeof(int));
dfs(1, 1, 1, 0, 0, 0);
for (j = 0; j < y * x; ++j)
printf("%4d%c", m[j/x+1][j%x+1], (j+1)%x?' ':'\n');
return 0;
}
其它地方我都看懂,就是那个dfs函数没看懂。
[解决办法]
KISS-Keep It Simple and Stupid.
- C/C++ code
#include <stdio.h>#define MAXN 10char m[MAXN+2][MAXN+2];char d;int x,y,k,n;void main() { while (1) { printf("Input n(1..%d):",MAXN); fflush(stdout); rewind(stdin); if (1==scanf("%d",&n)) { if (1<=n && n<=MAXN) break; } } y=0 ;for (x=0;x<=n+1;x++) m[y][x]=1; y=n+1;for (x=0;x<=n+1;x++) m[y][x]=1; x=0 ;for (y=0;y<=n+1;y++) m[y][x]=1; x=n+1;for (y=0;y<=n+1;y++) m[y][x]=1; for (y=1;y<=n;y++) { for (x=1;x<=n;x++) { m[y][x]=0; } } x=1; y=1; k=0; d='D'; while (1) { k++; if (k>n*n) break; m[y][x]=k; switch (d) { case 'D': if (0==m[y+1][x]) y++; else {x++;d='R';} break; case 'R': if (0==m[y][x+1]) x++; else {y--;d='U';} break; case 'U': if (0==m[y-1][x]) y--; else {x--;d='L';} break; case 'L': if (0==m[y][x-1]) x--; else {y++;d='D';} break; } } for (y=1;y<=n;y++) { for (x=1;x<=n;x++) { printf("%4d",m[y][x]); } printf("\n"); }}
[解决办法]
- C/C++ code
#include <stdio.h>#define N 5int main(){ int key[][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; int arr[N+1][N+1] = {0}; int i, x = 0, y = 0, k = 0; for(i=0; i<N*N; ++i){ arr[x][y] = i+1; if(x+key[k][0]<0 || x+key[k][0]>N-1 || y+key[k][1]<0 || y+key[k][1]>N-1 || arr[x+key[k][0]][y+key[k][1]]!=0 )//这里如果先给数组做边界初始化 越界探测可以省略 k = (k+1)%4; x+=key[k][0]; y+=key[k][1]; } for(i=0; i<N; ++i,puts("")) for(k=0; k<N; ++k) printf("%02d ", arr[i][k]); return 0;}