深搜例题(思路)

此贴不讲优化!!!

题目大意

(x_1,y_1) 走到 (x_2,y_2)8 个方向。

思路

经典灵魂 3 连问。

  • 边界;
  • 走过;
  • 墙;

代码:

if(xx<1||yy<1||xx>n||yy>m)continue;
if(vis[xx][yy]==1)continue;
if(c[xx][yy]=='#')continue;

因为是 \color{green}8 个方向,所以 \color{green}dx,dy 的初始值是:

  • 上: dx-1,dy
  • 下: dx+1,dy
  • 左: dx,dy-1
  • 右: dx,dy+1
  • 左上: dx-1,dy-1
  • 右上: dx-1,dy+1
  • 左下: dx+1,dy-1
  • 右下: dx+1,dy+1

代码:

int fx[8]={-1,1,0,0,-1,-1,1,1};
int fy[8]={0,0,-1,1,-1,1,-1,1};

因为有 8 个方向,且每个方向时间不同,所以:

  • i<4 时间 +2 ;直着走。
  • i>=4 时间 +3 ;斜着走。

代码:

if(i<4)
	dfs(xx,yy,bs+2);
else
	dfs(xx,yy,bs+3);

最后就是 vis ,也是最简单的部分。

  • 走过 vis=1
  • 返回 vis=0

整个 for 循环代码:

for(int i=0;i<8;i++){
	int xx=x+fx[i],yy=y+fy[i];
	if(xx<1||yy<1||xx>n||yy>m)continue;
	if(vis[xx][yy]==1)continue;
	if(c[xx][yy]=='#')continue;
	vis[xx][yy]=1;
	if(i<4)
		dfs(xx,yy,bs+2);
	else
		dfs(xx,yy,bs+3);
	vis[xx][yy]=0;
}

最后考虑到达目标:

  • mina=-1 ,让他等于时间;
  • 否则,让 mina 等于 mina时间 的最小值。

代码:

if(x==zbnlx&&y==zbnly){
	if(mina==-1)mina=sj;
	else mina=min(mina,sj);
}

最后是最终代码:

#include<bits/stdc++.h>
using namespace std;
int fx[8]={1,-1,-1,1,0,0,-1,1};
int fy[8]={1,-1,1,-1,-1,1,0,0};
int vis[105][105]={0};
char c[105][105];
int n,m;int mina=-1;
int zbfbx,zbfby,zbzzx,zbzzy;int sf=0;
void dfs(int x,int y,int bs){
	if(x==zbfbx&&y==zbfby){
		if(mina==-1)mina=bs;
		else mina=min(mina,bs);
	}
	for(int i=0;i<8;i++){
		int xx=x+fx[i],yy=y+fy[i];
		if(xx<1||yy<1||xx>n||yy>m)continue;
		if(vis[xx][yy]==1)continue;
		if(c[xx][yy]=='#')continue;
		vis[xx][yy]=1;
		if(i<4)
			dfs(xx,yy,bs+3);
		else
			dfs(xx,yy,bs+2);
		vis[xx][yy]=0;
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>c[i][j];
			if(c[i][j]=='@')zbzzx=i,zbzzy=j;
			if(c[i][j]=='%')zbfbx=i,zbfby=j;
		}
	}
	dfs(zbzzx,zbzzy,0);	
	cout<<mina<<endl;
	return 0;
}

后记

如果按此思路(Hard Version)可以得 {green}60 分。
60 分记录链接
点这里。
回看题目

详细吗
  • 非常详细
  • 详细
  • 优秀
  • 不详细
0 投票人

最后的最后

很有必要搞一个 `LaTeX大佬` 徽章 麻烦交一下意见,投个票,谢谢。

6 个赞

LaTeX 改了

5 个赞

很有必要搞一个 `LaTeX大佬` 徽章 麻烦交一下意见,投个票,谢谢。

4 个赞