fupincheng @ 2023-08-27 16:29:49
#include<bits/stdc++.h>
using namespace std;
int n,m,b,h[5][3]={{1,0},{0,1},{-1,0},{0,-1}},v[105][105];
string s[105];
void dfs(int x,int y){
if(b)return;
if(y==n&&x==m){
cout<<"Yes";
b=1;
exit(0);
}
for(int i=0;i<4;i++){
int xx=x+h[i][0];
int yy=y+h[i][1];
if(v[yy][xx]==0&&xx>=0&&xx<=m&&yy>=0&&yy<=n&&s[yy][xx]=='.'){
v[yy][xx]=1;
dfs(xx,yy);
v[yy][xx]=0;
}
}
}
int main(void){
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
cin>>s[i];
}
n--,m--;
dfs(0,0);
cout<<"No";
return 0;
}
by wdd2929 @ 2023-08-27 16:35:41
dfs中的
if(y==n&&x==m){
反了……
是
if(x==n&&y==m){
by AlexSong @ 2023-08-27 16:36:13
#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 wdd2929 @ 2023-08-27 16:37:03
我是这么写的,你可以参考一下
#include<iostream>
using namespace std;
int dxdy[]={0,1,0,-1,1,0,-1,0};
char map[102][102];
bool f[102][102];
int n,m;
bool flag=0;
void dfs(int x,int y){
if(x==n&&y==m){
flag=1;
return;
}
//if(flag)return;
for(int i=0;i<8;i+=2){
int x1=x+dxdy[i];
int y1=y+dxdy[i+1];
if(!f[x1][y1]&&map[x1][y1]=='.'){
f[x1][y1]=1;
dfs(x1,y1);
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>map[i][j];
dfs(1,1);
if(flag)cout<<"Yes";
else cout<<"No";
return 0;
}
by liu_le_chen @ 2023-08-27 16:46:24
#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;
}
我是这么写的,可以参考一下@fupincheng
by hehedago_QAQ_ @ 2023-08-27 16:50:40
#include<bits/stdc++.h>
using namespace std;
int n,m,h[5][3]={{1,0},{0,1},{-1,0},{0,-1}},ans[101][101];
string s[105];
void dfs(int x,int y){
if(ans[x][y]==1)return;
if(y==n&&x==m){
cout<<"Yes";
exit(0);
}
int a=0;
for(int i=0;i<4;i++){
int xx=x+h[i][0];
int yy=y+h[i][1];
if(xx>=0&&xx<=m&&yy>=0&&yy<=n&&s[yy][xx]=='.'){
s[yy][xx]='#';
dfs(xx,yy);
s[yy][xx]='.';
}
}
if(a==0)ans[x][y]=1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
cin>>s[i];
}
n--,m--;
s[0][0]='#';
dfs(0,0);
cout<<"No";
return 0;
}
加入记忆化即可
by hehedago_QAQ_ @ 2023-08-27 16:59:52
你的b数组没有用,
exit(0);就直接退出了
v也可以省略
但还是会超时,所以我加了记忆化
还有你没有初始化起点
代码刚刚发了
给个关注吧