gpt4 book ai didi

c - 洪水填埋不工作 (c)

转载 作者:行者123 更新时间:2023-11-30 17:59:56 25 4
gpt4 key购买 nike

我的洪水填充功能无法正常工作,但遇到了一些问题。此赋值的目的是查看 P 和 C 在数组内是否连接。在洪水填充函数中,它似乎没有将“_”更改为“P”

示例输入

5 
1 2
PC
2 1
P
C
2 2
P#
#C
2 2
P_
C_
8 7
__P____
####_##
_____#_
_____#C
##_###_
_____#_
___#_#_
___#___
5 7
__P____
####_##
_____#_
_____#C
##_###_

代码

#include <stdio.h>
#define MAXC 10
#define MAXR 10

void floodfill(char map[][MAXC+1], int i, int j, int r, int c);
int checklocation(char map[][MAXC+1], int i, int j, int r, int c);

int main() {


FILE* ifp = fopen("bunnies.in", "r");

int numcases, loop;
fscanf(ifp, "%d", &numcases);


for (loop=0; loop<numcases; loop++) {

int r, c, i=0, j=0;


fscanf(ifp, "%d%d", &r, &c);
//printf("\nRows = %d Cols = %d\n", r,c); //debug comment out
char map[r][c];

//Read in input
for(i=0; i<r; i++) {

map[i][j] = fgetc(ifp);

for (j=0; j<c; j++) {
map[i][j] = fgetc(ifp);
//printf("%c", map[i][j]); //test input read comment out
}
// printf("\n"); //test input read comment out
}

int broken = 0; //to keep track if floodfill already occured

for (i=0; i<r; i++) {

// if (broken == 1)
// continue;

for (j=0; j<c; j++) {

// if (broken == 1)
// continue;

//the whole loop only looks for P then floodfills
if(map[i][j] == 'P') {
floodfill(map, i, j, r, c);
// broken = 1;


}

// printf("%c", map[i][j]); //test floodfill, comment out later

}

//printf("\n"); //test floodfill, comment out later

}

int found = 0;

//searches for C, calls checklocation when found
for (i=0; i<r; i++) {
for(j=0; j<c; j++) {
if (map[i][j] == 'C')
found = checklocation(map, i,j, r, c);
}
}

if (found == 1)
printf("yes\n");
else
printf("no\n");

}

fclose(ifp);
return 0;

}


//Pass map pointer, position in array i,j and row/column numbers
void floodfill(char map[][MAXC+1], int i, int j, int r, int c) {

//printf("looking at: [%d][%d]\n", i,j); //debug comment out later

//'base case' that deals with out of bounds
if (i<0 || j<0 || i>=r || j>=c)
return;

if (map[i][j] != '_')
return;

if (map[i][j] == '_')
map[i][j] = 'P';



floodfill(map, r, c, i, j+1); //check right
floodfill(map, r, c, i, j-1); //check left
floodfill(map, r, c, i+1, j); //check below
floodfill(map, r, c, i-1, j); //check above

//printf("%c", map[i][j]);

}

//Same parameters as floodfill
int checklocation(char map[][MAXC+1], int i, int j, int r, int c) {

//these if statements check for p in each location around and
//makes sure the coordinate is in bounds
if (map[i-1][j] == 'P' && ((i>=0 && i < r) && (j>=0 && j < c)))
return 1;

else if (map[i+1][j] == 'P' && ((i>=0 && i < r) && (j>=0 && j < c)))
return 1;

else if (map[i][j+1] == 'P' && ((i>=0 && i < r) && (j>=0 && j < c)))
return 1;

else if (map[i][j-1] == 'P' && ((i>=0 && i < r) && (j>=0 && j < c)))
return 1;

else
return 0;

}

最佳答案

您的floodfill()好像坏了:

当您在 P 的位置调用它时,以下检查

if (map[i][j] != '_')
return;

将立即返回而不执行任何操作(因为 map[i][j]P ,而不是 _ )

尝试:

if (map[i][j] == '_') {
map[i][j] = 'P';

floodfill(map, r, c, i, j+1); //check right
floodfill(map, r, c, i, j-1); //check left
floodfill(map, r, c, i+1, j); //check below
floodfill(map, r, c, i-1, j); //check above
}

这将更改当前位置,并且仅在需要时调用周围的洪水填充

请注意,这仍然会跳过首字母 P,您可以通过设置 map[i][j] 来修复此问题。至_在您调用 floodfill() 之前来自main()

此外,您似乎从输入中读取了太多内容:

map[i][j] = fgetc(ifp);
for (j=0; j<c; j++) {
map[i][j] = fgetc(ifp);
...

将读取当前i的一个字符并为每个 j 阅读一篇再次。如果您在第一种情况下读取换行符,则无需将其存储在 map[i,j] 中。 ,尤其是这样做会在第一次循环 j 后改变 map (现在的值为 c )

另外,在 checklocation() ,您需要在检查 map 中的元素之前检查边界情况(正如吉恩在评论中暗示的那样),否则你的边界检查毫无值(value)。

关于c - 洪水填埋不工作 (c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11000116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com