走迷宫
这分明是一道广搜的模板题,但是我却搞了好久才搞懂。
最坑的地方:
1.起始点变不变为阻塞的,无影响
2.往四个方向搜索时,是满足条件再执行或者是不满足条件跳过,也无影响
3.进入深搜时的位置需要变为阻塞,所以起点最好也设定为阻塞。
4.不剪枝会超时,稍微剪一下就能过。
DFS + 回溯
#include<bits/stdc++.h>
using namespace std;
char arr[12][12];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
//DFS+回溯
int Min_step;
int M=10,N=10;
void dfs(int x, int y,int steps){
if((steps + abs(9-x) + abs(8-y)) >= Min_step) return; //剪枝
if(x==9&&y==8) { //终点
if(Min_step > steps) Min_step=steps;
return;
}
for(int i=0;i<4;i++){ //四个方向
int xx = x + dx[i];
int yy = y + dy[i];
if(xx>=0&&xx<M&&yy>=0&&yy<N&&arr[xx][yy]=='.'){ //要用限制条件
arr[xx][yy]='#';
dfs(xx,yy,steps+1);
arr[xx][yy]='.';
}
}
}
int main(){
while(~scanf("%s",arr[0])){
for(int i=1;i<10;i++){
scanf("%s",arr[i]);
}
Min_step=101;
arr[0][1]='#';
dfs(0,1,0);
printf("%d\n",Min_step);
}
return 0;
}
BFS
#include<bits/stdc++.h>
using namespace std;
char arr[25][25];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
//终于可以通过了!!!
struct point{
int x,y,step;
};
int bfs(){
queue<point> q;
point s;
s.x=0, s.y=1, s.step=0;
q.push(s);
arr[s.x][s.y]='#';
while(!q.empty()){
point e = q.front();
q.pop();
if(e.x==9&&e.y==8) return e.step;
for(int i=0;i<4;i++){
s.x = e.x + dx[i];
s.y = e.y + dy[i];
if(s.x>=0&&s.x<10&&s.y>=0&&s.y<10&&arr[s.x][s.y]!='#'){
s.step = e.step + 1;
arr[s.x][s.y]='#';
q.push(s);
}
}
}
return -1; //不加这个牛客网会出错
}
int main(){
while(~scanf("%s",arr[0])){
for(int i=1;i<10;i++){
scanf("%s",arr[i]);
}
printf("%d\n",bfs());
}
return 0;
}
DFS+回溯
#include<bits/stdc++.h>
using namespace std;
char arr[12][12];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
//DFS+回溯 超时
int Min_step;
int M=10,N=10;
void dfs(int x, int y,int steps){
if(steps >= Min_step) return; //稍微剪一下
if(x==9&&y==8) {
if(Min_step > steps) Min_step=steps;
return;
}
for(int i=0;i<4;i++){
int xx = x + dx[i];
int yy = y + dy[i];
if(xx<0||xx>=M||yy<0||yy>=N||arr[xx][yy]=='#') continue; //唯一不同的地方
arr[xx][yy]='#';
dfs(xx,yy,steps+1);
arr[xx][yy]='.';
}
}
int main(){
while(~scanf("%s",arr[0])){
for(int i=1;i<10;i++){
scanf("%s",arr[i]);
}
Min_step=101;
arr[0][1]='#';
dfs(0,1,0);
printf("%d\n",Min_step);
}
return 0;
}