2021.01.23
请不要在意23号的文章24号才写这件事。
广度搜索(bfs)及 深度搜索(dfs)。(还是以题代讲吧)
- 广度搜索
代码:
#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<map>
#include<cmath>
#include<iostream>
#include <queue>
#include <stack>
#include<algorithm>
#include<set>
using namespace std;
#define piii pair<int ,pair<int,int>>
const int inf = 0x3f3f3f3f;
const int M = 33;
char s[M][M][M];
int sx[M], sy[M],sz[M], dis[M][M][M];
int l, r, c;
int dx[M] = {1,-1,0,0,0,0};
int dy[M] = {0,0,1,-1,0,0};
int dz[M] = {0,0,0,0,1,-1};
void bfs()
{
queue<piii>q;
q.push(make_pair(sz[0], make_pair(sx[0], sy[0])));
dis[sz[0]][sx[0]][sy[0]] = 0;
while (!q.empty())
{
int z = q.front().first, x = q.front().second.first, y = q.front().second.second;
q.pop();
for (int i = 0; i < 6; i++)
{
int zz = z + dz[i], xx = x + dx[i], yy = y + dy[i];
if (1 <= zz && zz <= l && 1 <= xx && xx <= r && 1 <= yy && yy <= c && dis[zz][xx][yy] == inf && s[zz][xx][yy] != '#')
{
dis[zz][xx][yy] = dis[z][x][y] + 1;
q.push(make_pair(zz, make_pair(xx, yy)));
}
}
}
}
int main(){
while (scanf("%d %d %d", &l, &r, &c) != EOF && l)
{
memset(dis, inf, sizeof dis);
for (int i = 1; i <= l; i++)
for (int j = 1; j <= r; j++)
{
scanf("%s", s[i][j] + 1);
for (int k = 1; k <= c; k++)
{
if (s[i][j][k] == 'S')
{
sz[0] = i;
sx[0] = j;
sy[0] = k;
}
if (s[i][j][k] == 'E')
{
sz[1] = i;
sx[1] = j;
sy[1] = k;
}
}
}
bfs();
if (dis[sz[1]][sx[1]][sy[1]] != inf)
printf("Escaped in %d minute(s).\n", dis[sz[1]][sx[1]][sy[1]]);
else
printf("Trapped!\n");
}
return 0;
}
2.深度搜索
代码:
#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<map>
#include<cmath>
#include<iostream>
#include <queue>
#include <stack>
#include<algorithm>
#include<set>
using namespace std;
const int N =10+10;
int f[N],vis[N],n,cnt;
bool check(int row,int col)
{
if(vis[col])return false;
for(int i=1;i<=n;i++)
{
if(vis[i] && abs(i-col)==abs(vis[i]-row))return false;
}
return true;
}
void dfs(int now){
if(now==n+1){
cnt++;
return;
}
for(int i=1;i<=n;i++){
if(check(now,i)){
vis[i]=now;
dfs(now+1);
vis[i]=0;
}
}
}
int main(){
for(n=1;n<=10;n++){
memset(vis,0,sizeof vis);
cnt=0;
dfs(1);
f[n]=cnt;
}
int x;while(scanf("%d",&x)!=EOF){
if(x==0)break;
printf("%d\n",f[x]);
}
}
3.拓扑排序
代码:
#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<map>
#include<cmath>
#include<iostream>
#include <queue>
#include <stack>
#include<algorithm>
#include<set>
using namespace std;
#define LL long long
#define pii pair<int,int>
const int N = 100 + 10;
const int M = 100000 + 10;
const int inf = 0x3f3f3f3f;
const LL INF = 2e18;
int n, m, deg[N];
vector<int>G[N];
bool topo() {
queue<int>q;
for (int i = 0; i < n; i++)
if (!deg[i])
q.push(i);
while (!q.empty()) {
int x = q.front();
q.pop(); int sz = G[x].size();
for (int i = 0; i < sz; i++) {
int y = G[x][i];
if (--deg[y] == 0)q.push(y);
}
}
for (int i = 0; i < n; i++)if (deg[i])return false;
return true;
}
void init() {
for (int i = 0; i < n; i++)G[i].clear(), deg[i] = 0;
}
int main(){
while (scanf("%d %d", &n, &m) != EOF)
{
if (n == 0)break;
init();
for (int i = 1; i <= m; i++)
{
int x, y;
scanf("%d %d", &x, &y);
G[x].push_back(y);
deg[y]++;
}
if (topo())puts("YES");
else puts("NO");
for (int i = 0; i < n; i++)
printf("%d ", deg[i]);
}
return 0;
}
再见,再见~(挥手)