1;每次路径搜索要注意是否要进行变化和[还原(回溯)]=有必要的时候才会有回溯;
例如hdu1010题;判断t时刻是否可以从S到达D处;这里就要每次这个路径结束时要还原;也就是回溯;看代码实现;
for(i=0;i<4;i++)
{
int fx=x+dir[i][0];
int fy=y+dir[i][1];
if(fx>=0&&fx<n&&fy>=0&&fy<m&&map[fx][fy]!='X')
{
map[fx][fy]='X';//变化;这个步骤就是实现搜索的中心
dfs(fx,fy,cnt+1);
map[fx][fy]='.'; //回溯
}
}
看那两个map赋值就是完成这一步骤;实现变化和还原;
这一步骤就是实现了已fx,fy为中心往四周进行搜索的目的;
2;控制搜索的方向;就是用数组加上for循环来实现的;
看代码;
这是8方的搜索;要定义【8】【2】的数组;for(i = 0; i < 8; i++)来实现的;
4面也是同样的;
int fs[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};
void dfs(int x,int y)
{
int i,fx,fy;
for(i = 0; i < 8; i++){
fx = x + fs[i][0];
fy = y + fs[i][1];
if(fx>=0&&fx<a&&fy>=0&&fy<b&&map1[fx][fy]=='@'){
map1[fx][fy]='*';
dfs(fx,fy);
}
}
3;进入递归的那个if判断,一定要注意其边界条件;要控制在矩阵内部;
代码;
if(fx>=0&&fx<a&&fy>=0&&fy<b&&map1[fx][fy]=='@'){
map1[fx][fy]='*';
dfs(fx,fy);
}
4;读入字符的时候尽量使用%s进行读入;还要注意与之前的横列别搞错了。
for(i = 0; i < a; i++){
scanf("%s",map1[i]);
}
5;这也是最重要最灵活的一点;
根据题目要求;
在合适的地方插入判断或者变量进行计数判断;实现相应的目的。
hdu1241就是在主函数那插入num++;进行计数
for(i = 0; i < a; i++){
for(j = 0; j < b; j++){
if(map1[i][j]=='@'){
map1[i][j]='*';
num++;
dfs(i, j);
}
}
}
hdu1010的迷宫类型的题;
问t时刻是否可以到达D处;
就是利用插入if的判断实现目的的;这些判断也叫做剪枝了;