给出矩阵单元的位置,其周围为0

时间:2018-01-11 16:24:16

标签: c

我需要输入6对6矩阵并输出位置 他周围的所有单元格的值都为0。 让我们说:

1 1 1 1 1 1 
1 1 1 1 1 1 
0 0 1 1 1 1
2 0 1 1 1 1 
0 0 1 1 1 1 
1 1 1 1 1 1 

输出将是第3行col 0

这是我制作的代码..我是如何解决这个问题的? 我试过很多请帮助我

#include<stdio.h>
#define N 6
int main()
{
int arr[N][N] = { 0 }, i = 0, j = 0, x = 0, y = 0, counter = 0;  

        for (i = 0; i < N; i++)
        {
        for (j = 0; j < N; j++)//input//
        {
            scanf("%5d", &arr[i][j]);
        }
        printf("\n");
    } 

    for (i = 0; i < N; i++)//output//
    {
        for (j = 0; j < N; j++)
        {
            printf("%5d", arr[i][j]);
        }
        printf("\n");
    }


    for (i = 0; i < N; j++)
    {
    for (j = 0; j < N; j++)
    {
        for (x = i - 1; x <= i + 1; x + 2)
        {
            for (y = j - 1; y <= j + 1; y + 2)
            {

                if (x >= 0 && x < N &&y >= 0 && y < N&&arr[x][y] == 0)
                {
                    counter++;
                }

            }
        }

        if (i == 0 && j == 0 || i == 0 && j == N - 1 || i == N - 1 && j == 0 
|| i == N - 1 && j == N - 1)
        {
            if (counter == 3)
            {
                printf("the row is %d the col is %d\n", i, j);
            }
        }
        else if (i == 0 && j >= 1 && j < N - 1 || i == N - 1 && j >= 1 && j 
    < N - 1 && j == 0 && i >= 1 && i <= N - 1 && j == N - 1 && i >= 1 && i<N -1)
        {
            if (counter == 5)
            {
                printf("the row is %d the col is %d\n ", i, j);
            }
        }

        else
        {
            if (counter == 8)
            {
                printf("the row is %d the col is %d\n ", i, j);
            }
        }

        }
    }


    }

2 个答案:

答案 0 :(得分:1)

您的xy循环存在问题:

for (x = i - 1; x <= i + 1; x + 2)
{
    for (y = j - 1; y <= j + 1; y + 2)
    {
  1. 您没有在这些循环中递增xy。表达式x + 2仅仅计算值x + 2。它没有做任何事情。如果您想将x实际设置为x + 2,则需要使用x = x + 2,或更简洁地x += 2

  2. xy增加2是不正确的。它只检查4个点:(i-1,i-1),(i-1,i + 1),(i + 1,i-1)和(i + 1,i + 1)。它将跳过以下4点:(i-1,i),(i,i-1),(i,i + 1),(i + 1,i)。您需要每次将xy增加1,即在循环增量中使用x++y++而不是添加2.在循环内部,添加一个x == i && y == i的附加测试并跳过该点(中心点)。

答案 1 :(得分:0)

我相信这就是你想要的(请注意,如果以智能方式嵌套条件以避免检查矩阵外的区域,则可以在两个循环中执行eveything:)

#include <stdio.h>

#define ROWS 5
#define COLS 5

void printBlockeds(int M[ROWS][COLS])
{
    int i, j;
    for(i = 0; i < ROWS; ++i)
    {
        for(j = 0; j < COLS; ++j)
        {
            int isBlocked = 1;

            if(i > 0)
            {
                                isBlocked = isBlocked && !M[i-1][j];
                if(j > 0)       isBlocked = isBlocked && !M[i-1][j-1];
                if(j < COLS-1)  isBlocked = isBlocked && !M[i-1][j+1];
            }

            if(j > 0)           isBlocked = isBlocked && !M[i][j-1];
            if(j < COLS-1)      isBlocked = isBlocked && !M[i][j+1];

            if(i < ROWS-1)
            {
                                isBlocked = isBlocked && !M[i+1][j];
                if(j > 0)       isBlocked = isBlocked && !M[i+1][j-1];
                if(j < COLS-1)  isBlocked = isBlocked && !M[i+1][j+1];
            }

            if(isBlocked) printf("(%d, %d)\n", i, j);
        }
    }
}

int main()
{
    int M[ROWS][COLS] = {{1, 1, 1, 0, 1},
                         {1, 0, 0, 0, 0},
                         {1, 0, 1, 0, 1},
                         {1, 0, 0, 0, 1},
                         {1, 0, 1, 0, 1}};
    printBlockeds(M);
    return 0;
}

上述案例的输出:

(0, 4)
(2, 2)
(4, 2)