首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >尝试在C语言sudoku程序中将for循环更改为while循环

尝试在C语言sudoku程序中将for循环更改为while循环
EN

Stack Overflow用户
提问于 2018-05-13 04:32:16
回答 2查看 144关注 0票数 1

我正在尝试解决数独,我已经得到了这个代码,它工作得很好。我想把所有的for循环转换成while循环,我现在已经尝试了几个小时了,但是它不能工作。

以下是原始程序:

代码语言:javascript
复制
#include <stdio.h>

#define SIZE 9

int matrix[9][9] = {
    {8,0,0,0,0,0,0,0,0},
    {0,0,3,6,0,0,0,0,0},
    {0,7,0,0,9,0,2,0,0},
    {0,5,0,0,0,7,0,0,0},
    {0,0,0,0,4,5,7,0,0},
    {0,0,0,1,0,0,0,3,0},
    {0,0,1,0,0,0,0,6,8},
    {0,0,8,5,0,0,0,1,0},
    {0,9,0,0,0,0,4,0,0}
};

void print_sudoku()
{
    int i,j;
    for(i=0;i<SIZE;i++)
    {
        for(j=0;j<SIZE;j++)
        {
            printf("%d\t",matrix[i][j]);
        }
        printf("\n\n");
    }
}

int number_unassigned(int *row, int *col)
{
    int num_unassign = 0;
    int i,j;
    for(i=0;i<SIZE;i++)
    {
        for(j=0;j<SIZE;j++)
        {
            if(matrix[i][j] == 0)
            {
                *row = i;
                *col = j;
                num_unassign = 1;
                return num_unassign;
            }
        }
    }
    return num_unassign;
}
int is_safe(int n, int r, int c)
{
    int i,j;
    for(i=0;i<SIZE;i++)
    {
        if(matrix[r][i] == n)
            return 0;
    }
    for(i=0;i<SIZE;i++)
    {
        if(matrix[i][c] == n)
            return 0;
    }
    int row_start = (r/3)*3;
    int col_start = (c/3)*3;
    for(i=row_start;i<row_start+3;i++)
    {
        for(j=col_start;j<col_start+3;j++)
        {
            if(matrix[i][j]==n)
                return 0;
        }
    }
    return 1;
}
int solve_sudoku()
{
    int row;
    int col;
    if(number_unassigned(&row, &col) == 0)
        return 1;
    int n,i;
    for(i=1;i<=SIZE;i++)
    {
        if(is_safe(i, row, col))
        {
            matrix[row][col] = i;
            if(solve_sudoku())
                return 1;
            matrix[row][col]=0;
        }
    }
    return 0;
}

int main()
{
    if (solve_sudoku())
        print_sudoku();
    else
        printf("Error\n");
    return 0;
}

下面是我尝试过的方法,但不起作用:

代码语言:javascript
复制
#include <stdio.h>
#define SIZE 9

int matrix[9][9] = {
    {8,0,0,0,0,0,0,0,0},
    {0,0,3,6,0,0,0,0,0},
    {0,7,0,0,9,0,2,0,0},
    {0,5,0,0,0,7,0,0,0},
    {0,0,0,0,4,5,7,0,0},
    {0,0,0,1,0,0,0,3,0},
    {0,0,1,0,0,0,0,6,8},
    {0,0,8,5,0,0,0,1,0},
    {0,9,0,0,0,0,4,0,0}
};

void print_sudoku()
{
    int i;
    int j;

    i = 0;
    while(i < SIZE)
    {
        i++;
        j = 0;
        while(j < SIZE)
        {
            j++;
            printf("%d\t",matrix[i][j]);
        }
        printf("\n\n");
    }
}

int number_unassigned(int *row, int *col)
{
    int num_unassign = 0;
    int i,j;
    for(i=0;i<SIZE;i++)
    {
        for(j=0;j<SIZE;j++)
        {
            if(matrix[i][j] == 0)
            {
                *row = i;
                *col = j;
                num_unassign = 1;
                return num_unassign;
            }
        }
    }
    return num_unassign;
}


int is_safe(int n, int r, int c)
{
    int i;
    int j;

    i = 0;
    while(i < SIZE)
    {

        if(matrix[r][i] == n)
        i++;
            return 0;
    }
    i = 0;
    while(i < SIZE)
    {
        i++;
        if(matrix[i][c] == n)
            return 0;
    }
    int row_start;
    i = row_start;
    row_start = (r/3)*3;

    row_start = (c/3)*3;

    /* In particular, this loop in question */
    while(i < row_start + 3)
    {
        i++;
        int col_start;
        j = col_start;
        while(j<col_start + 3)
        {
            j++;
            if(matrix[i][j]==n)
                return 0;
        }
    }
    return 1;
}  

int solve_sudoku()
{
    int row;
    int col;
    int i;
    int n;
    i = 1;

    if (number_unassigned(&row, &col) == 0)
        return 1;
    while (i <= SIZE)
    {
        i++;
        if (is_safe(i, row, col))
        {
            matrix[row][col] = i;
            if(solve_sudoku())
                return (1);

            matrix[row][col] = 0;
        }
    }
    return (0);
}


int main()
{
    if (solve_sudoku())
        print_sudoku();
    else
        printf("le sudoku complet et juste\n");
    return 0;
}

你能帮我一下吗?非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2018-05-13 04:43:10

代码语言:javascript
复制
int i;
for(i = 0;i<n;i++){
     //Code inside
}

变成了

代码语言:javascript
复制
int i=0;
while(i<n){
    //Code inside
    i++;
}
票数 2
EN

Stack Overflow用户

发布于 2018-05-13 06:30:42

错误主要发生在从for(i=row_start;i<row_start+3;i++)开始提到的代码段中。您错误地将is_safe()中的这个双循环从:

代码语言:javascript
复制
int row_start = (r/3)*3;
int col_start = (c/3)*3;
for(i=row_start;i<row_start+3;i++)
{
    for(j=col_start;j<col_start+3;j++)
    {
        if(matrix[i][j]==n)
            return 0;
    }
}

添加到此代码。请注意,您混淆了row_startcol_start

代码语言:javascript
复制
int row_start;
i = row_start;

row_start = (r/3)*3;
row_start = (c/3)*3; // Error occurs here, notice the mis-declaration

while(i < row_start + 3)
{
    i++;
    int col_start;
    j = col_start;
    while(j<col_start + 3)
    {
        j++;
        if(matrix[i][j]==n)
            return 0;
    }
}
return 1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50310446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档