llllmz

导航

51. N 皇后c

\

这题就是第一次做的时候,斜线没考虑清楚,有四个方向斜线。

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
char temp[10][10]={0};
int visit[10][10]={0};

void in(int i,int j,int n){
    for(int x=0;x<n;x++){
        visit[x][j]++;
        visit[i][x]++;
    }
    int x=i,y=j;
    while(x<n&&y<n){
        visit[x++][y++]++;
    }
    int p=i-1,q=j-1;
    while(p>=0&&q>=0){
        visit[p--][q--]++;
    }
    p=i-1;
    q=j+1;
    while(p>=0&&q<n){
        visit[p--][q++]++;
    }
    p=i+1;
    q=j-1;
    while(p<n&&q>=0){
        visit[p++][q--]++;
    }

    visit[i][j]-=2;
    for(x=0;x<n;x++) temp[i][x]='.';
    temp[i][j]='Q';
}
void out(int i,int j,int n){
    for(int x=0;x<n;x++){
        visit[x][j]--;
        visit[i][x]--;
    }
    int x=i,y=j;
    while(x<n&&y<n){
        visit[x++][y++]--;
    }
    int p=i-1,q=j-1;
    while(p>=0&&q>=0){
        visit[p--][q--]--;
    }
    p=i-1;
    q=j+1;
    while(p>=0&&q<n){
        visit[p--][q++]--;
    }
    p=i+1;
    q=j-1;
    while(p<n&&q>=0){
        visit[p++][q--]--;
    }
    visit[i][j]+=2;
    for(int x=0;x<n;x++) temp[i][x]=0;
}

void dfs(char*** array,int n,int* returnSize,int* column,int index,int count){
    if(count>n||index>n) return;
    if(count==n){
        column[*returnSize]=count;
        array[*returnSize]=(char**)malloc(sizeof(char*)*n);
        for(int i=0;i<n;i++) array[*returnSize][i]=(char*)malloc(sizeof(char)*(n+1));
        for(int i=0;i<n;i++){
            for(int j=0;j<=n;j++){
                array[*returnSize][i][j]=temp[i][j];
            }
        }
        (*returnSize)++;
        return;
    } 
    for(int j=0;j<n;j++){
        if(visit[index][j]==0){
            in(index,j,n);
            dfs(array,n,returnSize,column,index+1,count+1);
            out(index,j,n);
        }
    }
}
char*** solveNQueens(int n, int* returnSize, int** returnColumnSizes) {
    int t[10][10]={0};
    *returnSize=0;
    int* column=(int*)malloc(sizeof(int)*5000);
    char*** array=(char***)malloc(sizeof(char**)*5000);
    dfs(array,n,returnSize,column,0,0);
    *returnColumnSizes=column;
    return array;
}

结果:

posted on 2024-03-10 14:00  神奇的萝卜丝  阅读(11)  评论(0)    收藏  举报