1.BFS
2.边权唯一和flood fill模型:
3.bfs的特点:
4.flood fill
t1:细胞,最基本的floodfill
代码如下:
#include <stdio.h> #include <algorithm> #include <cstring> #define x first #define y second using namespace std; typedef pair<int,int> PII; const int maxn=1010,maxm=1010*1010; char g[maxn][maxn]; bool st[maxn][maxn]; int n,m; PII q[maxm]; inline void bfs(int sx,int sy) { int head=0,tail=0; q[0]={sx,sy}; st[sx][sy]=true; while(head<=tail) { PII t=q[head++]; for(int i=t.x-1;i<=t.x+1;i++) for(int j=t.y-1;j<=t.y+1;j++) { if(i==t.x&&j==t.y) continue; if(i<0||i>=n||j<0||j>=m) continue; if(st[i][j]||g[i][j]==‘.‘) continue; st[i][j]=true; q[++tail]={i,j}; } } } int main() { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",g[i]); int cnt=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(!st[i][j]&&g[i][j]==‘W‘) { bfs(i,j); cnt++; } } printf("%d",cnt); return 0; }
注意编程细节:
T2城堡
T3判断型:
4.单源最短路:
T1迷宫:
#include <stdio.h> #include <algorithm> #include <cstring> #define x first #define y second using namespace std; typedef pair<int,int> PII; const int maxn=1010,maxm=1010*1010; int g[maxn][maxn]; PII q[maxm]; PII pre[maxn][maxn]; int n,m; void bfs(int sx,int sy) { int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; int head=0,tail=0; memset(pre,-1,sizeof(pre)); q[0]={sx,sy}; pre[sx][sy]={0,0};//pre数组也需要初始化 while(head<=tail) { PII t=q[head++]; for(int i=0;i<4;i++) { int a=t.x+dx[i],b=t.y+dy[i]; if(pre[a][b].x!=-1) continue; if(a<0||a>=n||b<0||b>=n) continue; if(g[a][b])continue; q[++tail]={a,b}; pre[a][b]=t; } } } int main() { scanf("%d",&n); for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&g[i][j]); bfs(n-1,n-1); PII end(0,0); while(true) { printf("%d %d\n",end.x,end.y); if(end.x==n-1&&end.y==n-1) break; end=pre[end.x][end.y]; } return 0; }
T2
#include <stdio.h> #include <algorithm> #include <cstring> #define x first #define y second using namespace std; typedef pair<int,int> PII; const int maxn=1010,maxm=1010*1010; int n,m; char g[maxn][maxn]; PII q[maxm]; int dis[maxn][maxn]; inline int bfs() { int dx[]={1,2,2,1,-1,-2,-2,-1}; int dy[]={2,1,-1,-2,-2,-1,1,2}; int sx,sy; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(g[i][j]==‘K‘) { sx=i,sy=j; break; } } int head=0,tail=0; q[0]={sx,sy}; memset(dis,-1,sizeof(dis)); dis[sx][sy]=0; while(head<=tail) { PII t=q[head++]; for(int i=0;i<8;i++) { int a=t.x+dx[i],b=t.y+dy[i]; if(dis[a][b]!=-1) continue; if(a<0||a>=n||b<0||b>=m) continue; if(g[a][b]==‘*‘) continue; if(g[a][b]==‘H‘) return dis[t.x][t.y]+1; dis[a][b]=dis[t.x][t.y]+1; q[++tail]={a,b}; } } } int main() { scanf("%d%d",&m,&n); for(int i=0;i<n;i++) scanf("%s",g[i]); printf("%d",bfs()); return 0; }
T3
原文:https://www.cnblogs.com/ILHYJ/p/13767715.html