创建多个线程,判断每一行,每一列和九个九宫格内的数是否都为1~9且不重复看看代码意思,给一些注释说明,

代码主要创建多个线程,判断每一行,每一列和九个九宫格内的数是否都为1~9且不重复
为什么数组第一行和列要加上0呢;
int flags[12]在后面是做什么用的
这个判断详细解释一下

if(j==0){
            for(m=1;m<=9;m++){
                memset(t,0,sizeof(int)*10);
                for(n=1;n<=9;n++){
                    t[num[m][n]]=1;
                }
                for(temp=1;temp<=9;temp++){
                    if(t[temp]==0){
                        flags[10]=0;
                        break;

这是全部代码

struct parameters
{
    int row;        //行号
    int column;        //列号
};
int flags[12]={1,1,1,1,1,1,1,1,1,1,1,1};
int num[10][10]={
    {0,0,0,0,0,0,0,0,0,0},
    {0,6,2,4,5,3,9,1,8,7},
    {0,5,1,9,7,2,8,6,3,4},
    {0,8,3,7,6,1,4,2,9,5},
    {0,1,4,3,8,6,5,7,2,9},
    {0,9,5,8,2,4,7,3,6,1},
    {0,7,6,2,3,9,1,4,5,8},
    {0,3,7,1,9,5,6,8,4,2},
    {0,4,9,6,1,8,2,5,7,3},
    {0,2,8,5,4,7,3,9,1,6}};
void *function(void *param)
{
    int i,j,m,n,temp;
    int t[10];
    struct parameters *data = (struct parameters*)param;
    i=data->row;
    j=data->column;
    if(i!=0&&j!=0){
        for(m=0;m<3;m++){
            for(n=0;n<3;n++){
                t[num[i+m][j+n]]=1;
            }
        }
        for(m=1;m<10;m++){
            if(t[m]==0){
                flags[i+j/3]=0;
            }
        }
    }else{
        if(j==0){
            for(m=1;m<=9;m++){
                memset(t,0,sizeof(int)*10);
                for(n=1;n<=9;n++){
                    t[num[m][n]]=1;
                }
                for(temp=1;temp<=9;temp++){
                    if(t[temp]==0){
                        flags[10]=0;
                        break;
                    }
                }
            }
        }else{
            for(m=1;m<=9;m++){
                memset(t,0,sizeof(int)*10);
                for(n=1;n<=9;n++){
                    t[num[n][m]]=1;
                }
                for(temp=1;temp<=9;temp++){
                    if(t[temp]==0){
                        flags[11]=0;
                        break;
                    }
                }
            }
            
        }
    }    
    pthread_exit(0);
}
int main()
{
    pthread_t tid;
    pthread_attr_t attr;
    int i,j;
    for(i=1;i<=11;i++)
    {
        struct parameters *para=(struct parameters*) malloc (sizeof(struct parameters));    
        switch(i){
            case 1:
                para->row=1;
                para->column=1;
                break;
            case 2:
                para->row=1;
                para->column=4;
                break;
            case 3:
                para->row=1;
                para->column=7;
                break;
            case 4:
                para->row=4;
                para->column=1;
                break;
            case 5:
                para->row=4;
                para->column=4;
                break;
            case 6:
                para->row=4;
                para->column=7;
                break;
            case 7:
                para->row=7;
                para->column=1;
                break;
            case 8:
                para->row=7;
                para->column=4;
                break;
            case 9:
                para->row=7;
                para->column=7;
                break;
            case 10:
                para->row=1;
                para->column=0;
                break;
            case 11:
                para->row=0;
                para->column=1;
                break;
        }
        pthread_attr_init(&attr);
        pthread_create(&tid,&attr,function,(void*)para);
        pthread_join(tid,NULL);    
        
    }
    for(i=1;i<=9;i++){
        for(j=1;j<=9;j++){
            printf("%d ",num[i][j]);
        }
        printf("\n");
    }
    for(i=1;i<12;i++){
        if(flags[i]==0){
            printf("No!\n");
            return 0;
        }
    }
    printf("Yes!\n");    
    return 0;