pku 3620简单搜索
题意:在一块地里面,干燥的点标记为0,潮湿的点标记为1;求相连的1的最大个数。
由于自己对搜索不太熟悉,当时以为是记忆化搜索,后来用dfs和bfs各写了一次后,感觉就是一纯粹的搜索而已。
我到目前也还觉得,记忆化搜索是DP的一类,搜索过的地方,记录下来,是要多次用到的。而这个题的搜索,只需简单的标记一下搜索过的地方,以便不会再搜,而对已搜索的地方进行标记是搜索题的一个共性吧?
当时写dfs多开了一个数组进行标记,后来看了一下别人的代码,看到标记数组都不用开,直接在原数组进行标记就得。这样我才开始思考,记忆化搜索与简单搜索的不同,记忆化搜索由于要用到搜索过的地方,直接用原数组进行了标记,就无法记录(也不能太绝对,可能有些情况用记录值也可以达到标记的效果,这个题貌似也可以,但可能就比较麻烦)。
这个题目用原数组进行标记的话,就要开一个变量统计每一轮搜索的最大值。但这种方法确实是好。
然后用bfs来写的话,就要用到一个队列。当时自己写一个队列类,调了N久才发现自己错在一个很低级的理解错误上。我定义一个类,类里面有静态成员,我的目的就是想让静态数据成员进行记录队列长度。然后又将类像链表结构体一样进行动态分配进行链接,还以为那个静态成员依然是原来那个。
写出来后发现有很大浪费,主要是由于指针指向没有认真分析,然后稳健性也非常不好。
干脆用STL的queue算了。
然后又没有注意同一个点进行了多次进队,WA一次。
// dfs
/*
#include <iostream>
using namespace std;
int data[101][101],n,m;
bool sgn[101][101];
int main()
{
int dfs(int,int);
int k,i,j,r,c,ans=0;
memset(data,0,sizeof(data));
memset(sgn,0,sizeof(sgn));
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=k;++i)
{
scanf("%d%d",&r,&c);
data[r][c]=1;
}
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
{
dfs(i,j);
ans=ans>data[i][j]?ans:data[i][j];
}
printf("%d\n",ans);
}
int dfs(int i,int j)
{
if(sgn[i][j]) return 0;
if(data[i][j]!=1) return data[i][j];
sgn[i][j]=1;
return data[i][j]+=dfs(i-1,j)+dfs(i,j+1)+dfs(i+1,j)+dfs(i,j-1);
}
*/
//bfs
/*
#include <iostream>
#include <queue>
using namespace std;
int data[101][101],n,m,num;
struct point
{
int x;int y;
};
queue<point> myq;
point conver(int a,int b)
{
point f;f.x=a;f.y=b;return f;
}
void bfs()
{
point s;
while(!myq.empty())
{
s=myq.front();
myq.pop();
if(data[s.x+1][s.y]==1) {myq.push(conver(s.x+1,s.y));data[s.x+1][s.y]=0;}
if(data[s.x][s.y+1]==1) {myq.push(conver(s.x,s.y+1));data[s.x][s.y+1]=0;}
if(data[s.x-1][s.y]==1) {myq.push(conver(s.x-1,s.y));data[s.x-1][s.y]=0;}
if(data[s.x][s.y-1]==1) {myq.push(conver(s.x,s.y-1));data[s.x][s.y-1]=0;}
++num;
}
}
int main()
{
int k,i,j,r,c,max=0;
scanf("%d%d%d",&n,&m,&k);
memset(data,0,sizeof(data));
for(i=1;i<=k;++i)
{
scanf("%d%d",&r,&c);
data[r][c]=1;
}
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
if(data[i][j]==1)
{
data[i][j]=0;
myq.push(conver(i,j));
num=0;
bfs();
if(num>max) max=num;
}
printf("%d\n",max);
return 0;
}
*/