搜索算法

登录以参加训练计划

模板

深度优先搜索 dfs

#include <bits/stdc++.h>
using namespace std;
//                 1 2 3 4 5 6 7 8 9 10111213
int mp[14][14]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,1,0,0,0,1,0,0,1,0,0,0},
				{0,0,1,1,0,1,1,1,1,0,1,0,1,0},
		 		{0,0,0,0,0,0,0,1,0,0,0,0,1,0},
				{0,0,1,0,1,1,0,1,1,0,1,0,0,0},
				{0,0,1,0,1,0,0,0,0,0,1,1,1,0},
				{0,1,1,0,1,1,1,0,1,0,1,0,0,0},
				{0,0,0,0,1,0,0,0,1,0,0,0,1,0},
				{0,0,1,1,1,0,1,1,1,0,1,1,1,0},
				{0,0,1,0,0,0,1,0,0,0,0,0,1,0},
				{0,0,1,0,1,0,1,1,0,1,1,0,1,0},
				{0,0,0,0,1,0,0,0,0,1,0,0,1,0},
				{0,0,1,1,1,1,1,0,1,1,0,1,1,0},
				{0,0,0,1,0,0,0,0,1,0,0,0,0,0},};
int vis[14][14];//vis[i][j]=0 没走过 1走过  
int n=13,m=13;
int fx=3,fy=1,sx=10,sy=13;
int cnt=0;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int ans=0;

void dfs(int x,int y,int len){//位置 x y
	if(x==sx&&y==sy){//终点 
		cnt++;
		ans=max(ans,len);
		return ;
	}
	// i=2 下 
	for(int i=0;i<=3;i++){
		int tx=x+dx[i],ty=y+dy[i];
		if(tx>=1 && tx<=n && ty>=1 && ty<=m && mp[tx][ty]==0 && vis[tx][ty]==0){//不出界  不是障碍 不能走过 
			vis[tx][ty]=1;
			dfs(tx,ty,len+1);
			vis[tx][ty]=0; 
		}	
	}		
}


int main(){
	vis[fx][fy]=1; 
	dfs(fx,fy,0);
	cout<<cnt;
}




//	//上  tx=x+-1  ty=y+0  tx=x+dx[0]  ty=y+dy[0]
//	{
//		int tx=x+dx[0],ty=y+dy[0];
//		if(tx>=1 && tx<=n && ty>=1 && ty<=m && mp[tx][ty]==0 && vis[tx][ty]==0){//不出界  不是障碍 不能走过 
//			vis[tx][ty]=1;
//			dfs(tx,ty);
//			vis[tx][ty]=0; 
//		}	
//	}
//	//右  tx=x+0  ty=y+1 tx=x+dx[1]  ty=y+dy[1]
//	{
//		int tx=x+dx[1],ty=y+dy[1];
//		if(tx>=1 && tx<=n && ty>=1 && ty<=m && mp[tx][ty]==0 && vis[tx][ty]==0){//不出界  不是障碍 不能走过 
//			vis[tx][ty]=1;
//			dfs(tx,ty);
//			vis[tx][ty]=0; 
//		}	
//	}
//	//下  tx=x+1  ty=y+0 tx=x+dx[2]  ty=y+dy[2]
//	{
//		int tx=x+dx[2],ty=y+dy[2];
//		if(tx>=1 && tx<=n && ty>=1 && ty<=m && mp[tx][ty]==0 && vis[tx][ty]==0){//不出界  不是障碍 不能走过 
//			vis[tx][ty]=1;
//			dfs(tx,ty);
//			vis[tx][ty]=0; 
//		}	
//	}
//	//左  tx=x+0  ty=y+-1 tx=x+dx[3]  ty=y+dy[3]
//	{
//		int tx=x+dx[3],ty=y+dy[3];
//		if(tx>=1 && tx<=n && ty>=1 && ty<=m && mp[tx][ty]==0 && vis[tx][ty]==0){//不出界  不是障碍 不能走过 
//			vis[tx][ty]=1;
//			dfs(tx,ty);
//			vis[tx][ty]=0; 
//		}	
//	}


广度优先搜索

bfs

#include <bits/stdc++.h>
using namespace std;
int n,m;
int mp[][];
int vis[][];
int fx,fy,sx,sy;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
struct ST{
	int x,y;
};
queue<ST>Q; 

int main(){
	memset(vis,-1,sizeof(vis));//初始化vis数组都为-1 
	
	Q.push({fx,fy});
	vis[fx][fy]=0;
	while(Q.size()>0){
		ST t=Q.front();
		Q.pop();
		if(t.x==sx&&t.y==sy){
			。。。。
			break; 
		}
		for(int i=0;i<=3;i++){
			int tx=t.x+dx[i];
			int ty=t.y+dy[i];
			if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&mp[tx][ty]==0&&vis[tx][ty]==-1){
				vis[tx][ty]=vis[t.x][t.y]+1;
				Q.push({tx,ty});
			}
		}
	}
}


章节 1. 搜索狂练

开放

题目 尝试 AC 难度
P1098   寻找团伙 0 0 (无)
P1080   单词方阵 0 0 (无)
P1081   平台 0 0 (无)
P1082   波浪数 0 0 (无)
P1083   小木棍 1 1 10
P1084   取数游戏 0 0 (无)
P1085   机器人搬重物 0 0 (无)
P1086   词链 0 0 (无)
P1087   数字生成游戏 0 0 (无)
P1088   单向双轨道 0 0 (无)
P1089   01迷宫 1 1 10
P1090   约瑟夫 0 0 (无)
P1091   硬币翻转 0 0 (无)
P1092   [NOIP 2008 提高组] 火柴棒等式 0 0 (无)
P1093   子数整数 0 0 (无)
P1094   组合的输出 0 0 (无)
 
参加人数
2
创建人