搜索分为
一、深搜
dfs和回溯是不同的概念
例题:
1792:迷宫
访问过就不能再访问了
然后注意起始点或者终结点为#的情况
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 101;
char map[maxn][maxn];
int vis[maxn][maxn];
int ha,la,hb,lb;
int n;
int dir[4][2] = {1,0,0,1,-1,0,0,-1};
int flag;
void dfs(int x,int y)
{
if(x==hb&&y==lb)
{
flag = 1;
return;
}
for(int i=0;i<4;i++)
{
int dx = x+dir[i][0];
int dy = y+dir[i][1];
if(map[dx][dy]=='.'&&!vis[dx][dy]&&dx>=0&&dx<n&&dy>=0&&dy<n)
{
vis[dx][dy] = 1;
dfs(dx,dy);
//vis[dx][dy] = 0;
}
}
return;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
flag = 0;
scanf("%d",&n);
for(int i=0;i<n;i++)
cin>>map[i];
scanf("%d %d %d %d",&ha,&la,&hb,&lb);
if(map[ha][la]=='#'||map[hb][lb]=='#')
{
cout<<"NO"<<endl;
continue;
}
vis[ha][la] = 1;
dfs(ha,la);
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
1388:Lake Counting
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 101;
char map[maxn][maxn];
int vis[maxn][maxn];
int ha,la,hb,lb;
int n,m;
int cnt;
int dir[8][2] = {1,0,0,1,-1,0,0,-1,1,1,-1,-1,1,-1,-1,1};
void dfs(int x,int y)
{
for(int i=0;i<8;i++)
{
int dx = x+dir[i][0];
int dy = y+dir[i][1];
if(map[dx][dy]=='W'&&dx>=0&&dx<n&&dy>=0&&dy<m&&!vis[dx][dy])
{
//cnt++;
vis[dx][dy] = 1;
dfs(dx,dy);
//vis[dx][dy] = 0;
}
}
return;
}
int main()
{
cnt = 0;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
cin>>map[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='W'&&!vis[i][j])
{
cnt++;
vis[i][j] = 1;
dfs(i,j);
}
}
}
cout<<cnt<<endl;
return 0;
}
二、广搜
模板题:
2971:抓住那头牛
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int n,m;
const int N = 200100;
struct node
{
int x;
int step;
};
int vis[N];
queue<node> q;
void bfs()
{
int Step;
int X;
node temp;
while(!q.empty())
{
temp = q.front();
q.pop();
X = temp.x;
Step = temp.step;
if(X==m)
{
cout<<Step<<endl;
return;
}
if(X>=1&&!vis[X-1])
{
node tmp;
vis[X-1] = 1;
tmp.x = X-1;
tmp.step = Step+1;
q.push(tmp);
}
if(X<=m&&!vis[X+1])
{
node tmp;
vis[X+1] = 1;
tmp.x = X+1;
tmp.step = Step+1;
q.push(tmp);
}
if(X<=m&&!vis[X*2])
{
node tmp;
vis[X*2] = 1;
tmp.x = X*2;
tmp.step = Step+1;
q.push(tmp);
}
}
}
int main()
{
while(cin>>n>>m)
{
memset(vis,0,sizeof(vis));
vis[n] = 1;
node tmp;
tmp.x = n;
tmp.step = 0;
q.push(tmp);
bfs();
}
return 0;
}