迷宫
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<set>
#include<map>
#define int long long
#define fi first
#define se second
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef pair<int, int>pii;
const int N = 110;
int n;
int sx,sy,a,b;
char g[N][N];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
bool st[N][N];
bool dfs(int x,int y){
if(g[sx][sy]=='#'||g[a][b]=='#') return false;
if(x==a&&y==b) return true;
st[x][y]=true;
for(int i=0;i<4;i++){
int tx=x+dx[i],ty=y+dy[i];
if(tx<0||tx>=n||ty<0||ty>=n) continue;
if(g[tx][ty]=='#') continue;
if(st[tx][ty]) continue;
if(dfs(tx,ty)) return true;
// else return false;不能加这个,因为只是当前扩展点(tx,ty)不满足要求,但是还可以继续往别的方向扩展
}
return false;
}
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int k;
cin>>k;
while(k--){
memset(st,0,sizeof st);
cin>>n;
for(int i=0;i<n;i++) cin>>g[i];
cin>>sx>>sy>>a>>b;
if(dfs(sx,sy)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
debug
代码那个else地方错误,要想象dfs怎么搜索的,扩展节点扩展的时候,有四种扩展方向,一种不行可以继续往下一种,而不是直接return
总结
其实和bfs差不多,只是扩展的顺序不一样。
红与黑
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<set>
#include<map>
#define int long long
#define fi first
#define se second
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef pair<int, int>pii;
const int N =22 ;
int n,m;
char g[N][N];
bool st[N][N];
int ans;
int sx,sy;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
void dfs(int x,int y){
ans++;
st[x][y]=true;
for(int i=0;i<4;i++){
int a=x+dx[i],b=y+dy[i];
if(a<0||a>=n||b<0||b>=m) continue;
if(g[a][b]=='#') continue;
if(st[a][b]) continue;
dfs(a,b);
}
}
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
while(cin>>m>>n,n||m){
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
cin>>g[i][j];
if(g[i][j]=='@')
sx=i,sy=j;
}
ans=0;
memset(st,0,sizeof st);
dfs(sx,sy);
cout<<ans<<endl;
}
return 0;
}
debug
Presentation Error表示答案输出格式错误