看搜索已经很久了,对于搜索的思想从原来的死记硬背到现在终于懂了一点其实也蛮不错吧,我自己先总结出来了几条关于在图里面深搜的几条方法,仅供参考:
首先:我们得知道深搜是什么,其次于广搜的区别是什么。然后又哪些模板
举一个深搜例子:red and black:这是初学者最常见到的题。对于这题我们所要考虑的就是在#围成的墙中’.‘的个数,这个题先要找到@的位置,这个好办,直接:
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(map[i][j]=='@')
}
}
找到之后就可以愉快的从这个点进行搜索了。然后我们应该讲到了关于深搜和广搜的区别了,你如果搜到了这个点,如果是广搜的话它会以这个味起点从它的旁支进行搜索,但是深搜不同它只会向他的儿子节点进行搜索一直到达边界,或者是
‘#’,然后需要进行的一步就是标记,这个可以说是深搜必需要做的事情,标记它防止再次进入循环。最后就是去递归,可以想象,当你没有路可以走的时候,你当然是回家去或者是四处找路,可以说是深搜像”不撞南墙不回头“。
if(tx>=0&&tx<m-1&&ty>=0&&ty<n-1&&map[tx][ty]=='*');
{
sum++;
map[tx][ty];
dfs(tx,ty);
}
red and black的代码:
<pre name="code" class="cpp">#include<iostream>
using namespace std;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
char map[101][101];
int m,n,sum;
void dfs(int x,int y)
{
int i;
for(i=0;i<4;i++)
{
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if(tx>=0&&tx<n&&ty>=0&&ty<m&&map[tx][ty]=='.')
{
sum++;
map[tx][ty]='#';
dfs(tx,ty);
}
}
}
int main()
{
int i,j;
while(cin>>m>>n&&m+n)
{
sum=1;
for(i=0;i<n;i++)
cin>>map[i];
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(map[i][j]=='@')
{
int sx=i;
int sy=j;
dfs(sx,sy);
map[i][j]='#';
}
}
}
cout<<sum<<endl;
}
return 0;
}
对于图搜还是比较简单的比如hdu的
Oil Deposits,要你找到它的连通@的个数,其实我们只要从@开始进行搜索,然后当朝着它的几个方向进行搜索时如果没有遇到@了然后就返回主函数sum++;
代码:
#include<iostream>
using namespace std;
char map[1001][1001];
int m,n,sum;
int dir[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;
for(i=0;i<8;i++)
{
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if(tx>=0&&tx<m&&ty>=0&&ty<n&&map[tx][ty]=='@')
{
map[tx][ty]='*';
dfs(tx,ty);
}
}
}
int main()
{
int i,j;
while(cin>>m>>n&&m+n)
{
sum=0;
for(i=0;i<m;i++)
scanf("%s",map[i]);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(map[i][j]=='@'){
map[i][j]='*';
dfs(i,j);
sum++;
}
}
}
cout<<sum<<endl;
}
return 0;
}
图搜还是比较简单的。
模板:
一:我们首先要的是方向,方向有很多种,自己慢慢去总结后面我也会陆续完善这篇文章的,对于图搜的话,无非就是一个四个方向和八个方向,构建一个二维数组,对于其他的话需要自己去理解;
二:就是去找到自己的一个边界
三:就是输图了。
深搜总结:
题目列表:
一)、杭电:
二)、poj: