您的位置:首页 > 其它

深入优先算法

2015-12-07 17:18 281 查看
今天使用深入搜索算法,搜算关于一个水坑的问题。好久没有认真看看C++的书,在该问题上发现自己还有很多地方不熟悉了。比如C++中数组的传递应该写成 void dfs(int x,int y,char(&field)[N][M]) 其中[]的优先级比&要高,所以之前传值传递不行。
#include <iostream>
using namespace std;

#define N 10
#define M 12

//首先第一步将当前的地方设置为'.',其次检查所有的其他的地方看是不是符合要求,并进行递归调用
void dfs(int x,int y,char (&field)
[M]){

field[x][y] = '.';

for (int i = -1; i < 2; ++i)
{
for (int j = -1; j < 2; ++j)
{
int nx=x+i,ny=y+j;
if (0<=nx && nx <N && 0<=ny && ny<M && (field[nx][ny] == 'W') )
{
dfs(nx,ny,field);
}
}
}

}

int main(int argc, char const *argv[])
{

char field
[M] = {
{'W','.','.','.','.','.','.','.','.','W','W','.'},
{'.','W','W','W','.','.','.','.','.','W','W','W'},
{'.','.','.','.','W','W','.','.','.','W','W','.'},
{'.','.','.','.','.','.','.','.','.','W','.','.'},
{'.','.','.','.','.','.','.','.','.','W','W','.'},
{'.','.','.','.','.','.','.','.','.','.','W','.'},
{'W','W','.','.','.','.','.','.','.','W','W','.'},
{'W','.','.','.','.','.','.','.','.','.','.','W'},
{'W','W','.','.','.','.','.','.','.','.','W','.'},
{'.','W','.','.','.','.','.','.','.','.','.','W'}
};

int res = 0;
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < M; ++j)
{
if (field[i][j]=='W')
{
dfs(i,j,field);
res++;
}
}
}
cout<<res<<endl;

cout<<"gfs is over!"<<endl;
return 0;
}
  另外的一种写法是:将field数组声明为全局变量:externchar field[N][M]
#include <iostream>
using namespace std;

#define N 10
#define M 12

extern char field
[M] = {
{'W','.','.','.','.','.','.','.','.','W','W','.'},
{'.','W','W','W','.','.','.','.','.','W','W','W'},
{'.','.','.','.','W','W','.','.','.','W','W','.'},
{'.','.','.','.','.','.','.','.','.','W','.','.'},
{'.','.','.','.','.','.','.','.','.','W','W','.'},
{'.','.','.','.','.','.','.','.','.','.','W','.'},
{'W','W','.','.','.','.','.','.','.','W','W','.'},
{'W','.','.','.','.','.','.','.','.','.','.','W'},
{'W','W','.','.','.','.','.','.','.','.','W','.'},
{'.','W','.','.','.','.','.','.','.','.','.','W'}
};

//首先第一步将当前的地方设置为'.',其次检查所有的其他的地方看是不是符合要求,并进行递归调用
void dfs(int x,int y){

field[x][y] = '.';

for (int i = -1; i < 2; ++i)
{
for (int j = -1; j < 2; ++j)
{
int nx=x+i,ny=y+j;
if (0<=nx && nx <N && 0<=ny && ny<M && (field[nx][ny] == 'W') )
{
dfs(nx,ny);
}
}
}

}
int main(int argc, char const *argv[])
{
int res = 0;
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < M; ++j)
{
if (field[i][j]=='W')
{
dfs(i,j);
res++;
}
}
}
cout<<res<<endl;

cout<<"gfs is over!"<<endl;
return 0;
}
  
今天是第一天真正的开始思考关于算法的知识,现在在算法上面还是属于超级小白的阶段,但是好好加油,相信总有一天会更加的优秀的!来自为知笔记(Wiz)
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: