我正在研究CSES问题集,以便在C++上练习。我正在使用RTools的g++编译器(g++(由Jeroen为R项目构建(8.3.0(和Visual Studio Code在Windows 10 Pro 64位上工作。 我正在使用以下内容编译我已完成的所有程序:
g++ -std=c++17 -Wall .filename.cpp -o .filename.exe
我已经使用 DFS 解决了这个问题,但是当我看到另一个用户的解决方案时,我意识到我的解决方案结合了 (1( DFS 和 (2( 找到有效的边缘,所以我试图实现一个将 (1( 和 (2( 分开的解决方案。 我相信我的问题集中在忘记如何将 2-d char 数组传递给函数上。 在下面的代码中,我使用了发生这些错误的"^"符号包含了我从VSCode IntelliSense收到的错误(总共3个错误(。 我已经通过将错误行分成两 (2( 行来格式化每个错误的智能感知。 此外,我重新格式化了我的代码以适应 80 列的宽度(为了清楚起见,请在此处发布(:
//
// CSES Problem Set
// Projects
//
// From:
// https://cses.fi/problemset/task/1192
//
// Example:
// Input:
// 5 8
// ########
// #..#...#
// ####.#.#
// #..#...#
// ########
//
// Output:
// 3
//
#include <iostream>
using namespace std;
bool valid_edge( int y, int x, int MAX_ROWS, int MAX_COLS, char bld_map ) {
return ( y >= 0 && y < MAX_ROWS &&
x >= 0 && x < MAX_COLS && bld_map[ y ][ x ] == '.' );
^
expression must have
pointer-to-object type
} // bool valid
void dfs( int y, int x, int MAX_ROWS, int MAX_COLS, char bld_map ) {
bld_map[ y ][ x ] = '#';
^
expression must have
pointer-to-object type
if( valid_edge( y - 1, x, MAX_ROWS, MAX_COLS, bld_map ) ) {
dfs( y - 1, x, MAX_ROWS, MAX_COLS, bld_map );
} // if
if( valid_edge( y + 1, x, MAX_ROWS, MAX_COLS, bld_map ) ) {
dfs( y + 1, x, MAX_ROWS, MAX_COLS, bld_map );
} // if
if( valid_edge( y, x - 1, MAX_ROWS, MAX_COLS, bld_map ) ) {
dfs( y, x - 1, MAX_ROWS, MAX_COLS, bld_map );
} // if
if( valid_edge( y, x + 1, MAX_ROWS, MAX_COLS, bld_map ) ) {
dfs( y, x + 1, MAX_ROWS, MAX_COLS, bld_map );
} // if
} // void dfs
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int bld_rows; // rows
int bld_cols; // columns
cin >> bld_rows >> bld_cols;
char bld_map[ 1000 ][ 1000 ];
for( int i = 0; i < bld_rows; i++ ) {
for( int j = 0; j < bld_cols; j++ ) {
cin >> bld_map[ i ][ j ];
} // for
} // for
int room_count = 0;
for( int y = 0; y < bld_rows; y++ ) {
for( int x = 0; x < bld_cols; x++ ) {
if( valid_edge( y, x ) ) {
dfs( y, x, bld_rows, bld_cols, bld_map );
^
arg of type "char (*)[1000]"
is incompatible w/ parameter
of type "char"
room_count++;
} // if
} // for
} // for
cout << room_count;
return 0;
} // int main
我看过其他 StackOverflow 问答,但没有一个答案澄清将 2-d char 数组正确传递给函数的过程。 有谁知道如何纠正我的代码? 如果有人想看到我使用C++ STL的(不同的(工作版本,我在CodePile上有一个副本:
https://www.codepile.net/pile/1EPZQMze
尽管在if( valid_edge( y, x ) )
中存在错误,但罪魁祸首是用于将 2D 数组传递给函数的语法。在void dfs( int y, int x, int MAX_ROWS, int MAX_COLS, char bld_map )
和bool valid_edge( int y, int x, int MAX_ROWS, int MAX_COLS, char bld_map )
中,您正在将一个名为bld_map
的char
传递给函数,然后执行bld_map[ y ][ x ]
。你不能对字符这样做。
您可以将参数更改为char bld_map[][1000]
(或任何数组的大小(,或者只使用内置的 std::array,这比在 C++ 中使用 C 样式数组更可取。