读书人

一个for语句完成构建螺旋矩阵哪位高

发布时间: 2012-10-19 16:53:36 作者: rapoo

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

读书人网 >C++

热点推荐