Syncc @ 2023-08-10 15:05:17
#include<bits/stdc++.h>
using namespace std;
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0},n,m;
bool vis[1005][1005],flag=0;
char g[1005][1005];
void dfs(int x,int y){
if(x==n && y==m){
flag=1;
return ;
}
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx<1 || nx>n || ny<1 || ny>m){
continue;
}
if(g[nx][ny]=='.' && vis[nx][ny]==0){
vis[nx][ny]=1;
dfs(nx,ny);
}
}
}
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>g[i][j];
}
}
if(g[1][1]=='#' || g[n][m]=='#'){
cout<<"No";
return 0;
}
vis[1][1]=1;
dfs(1,1);
if(flag==0){
cout<<"No";
}else{
cout<<"Yes";
}
return 0;
}
by liu_le_chen @ 2023-08-10 15:12:46
if(g[1][1]=='#' || g[n][m]=='#'){
cout<<"No";
return 0;
}
这个判断好像不用
by liu_le_chen @ 2023-08-10 15:15:56
if(g[nx][ny]=='.' && vis[nx][ny]==0){
vis[nx][ny]=1;
dfs(nx,ny);
vis[nx][ny]=0;
}
这是深搜,好像要回溯
by liu_le_chen @ 2023-08-10 15:27:27
#include<bits/stdc++.h>
using namespace std;
long long n,m,f,flag[1001][1001],vis[4][2]={-1,0,1,0,0,-1,0,1};
char arr[1001][1001];
struct node{
int x,y;
};
queue<node> q;
void bfs(){
q.push({1,1});
flag[1][1]=1;
while(!q.empty()){
for(int i=0;i<4;i++){
int xx=q.front().x+vis[i][0];
int yy=q.front().y+vis[i][1];
if(arr[xx][yy]=='.' && flag[xx][yy]==0 && xx>=1 && xx<=n && yy>=1 && yy<=m){
flag[xx][yy]=1;
if(xx==n && yy==m){
cout<<"Yes";
f=0;
return;
}
q.push({xx,yy});
}
}
q.pop();
}
}
int main(){
f=1;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>arr[i][j];
}
}
bfs();
if(f) cout<<"No";
return 0;
}
其实这题用广搜更简单
by 2023niuyanben @ 2023-08-10 16:52:05
写到这地步已经很牛逼了