B3625 迷宫寻路
思路:广度优先搜索
#include<iostream>
#include<algorithm>
using namespace std;
int dx[4] = {0,1,0,-1}; //{-1,0,0,1};
int dy[4] = {-1,0,1,0}; //{0,1,-1,0};
int dt[105][105];
bool vis[105][105],flag;
int n, m;
void dfs(int x, int y);
int main()
{
cin >> n >> m;
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
{
char c;
cin >> c;
if (c=='#') dt[i][j] = 1;
}
}
// for (int i=1; i<=n; i++)
// {
// for (int j=1; j<=m; j++)
// {
// cout << dt[i][j] << ' ';
// }
// cout << endl;
// }
dfs(1,1);
if (flag) cout << "Yes";
else cout << "No";
return 0;
}
void dfs(int x, int y)
{
if (flag) return ;
vis[x][y] = 1;
if (x==n && y==m)
{
flag = 1;
return;
}
for (int i=0; i<4; i++)
{
int xx = x+dx[i];
int yy = y+dy[i];
if (xx<1 || yy<1 || xx>n || yy>m) continue;
if (!vis[xx][yy] && !dt[xx][yy]) dfs(xx,yy);
}
}
P1706 全排列问题
思路:深度优先搜索
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <bits/stdc++.h>
using namespace std;
int i,j;
const int maxn=10+5;
int digit[maxn],temp[maxn];
bool judge[maxn];
int n,cnt;
inline void sequence(int cnt)
{
int i;
if(cnt==n)
{
for(i=0;i<n;i++)
{
printf("%5d",temp[i]);
}
cout<<endl;
}
for(i=0;i<n;i++)
{
if(judge[i]==0)
{
judge[i]=1;
temp[cnt]=digit[i];
sequence(cnt+1);
judge[i]=0;
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
digit[i]=i+1;
}
sequence(0);
return 0;
}
P1451 求细胞数量
思路:深度优先搜索
#include<iostream>
using namespace std;
int ans;
int dr[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
bool b[105][105];
void search(int x,int y)
{
b[x][y]=false;
for(int i=0;i<4;i++)
{
int nx=x+dr[i][0],ny=y+dr[i][1];
if(b[nx][ny])search(nx,ny);
}
}
int main()
{
int n,m;
char k;
cin>>m>>n;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>k;
if(k!='0')b[i][j]=true;
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(b[i][j])
{
search(i,j);
ans++;
}
}
}
cout<<ans;
return 0;
}
P1219 [USACO1.5] 八皇后 Checker Challenge
思路:深度优先搜索
#include<cstdio>
#include<cmath>
using namespace std;
int n,cnt = 0,v[20],a[100] = {0},b[100] = {0},hashtable[20] = {0};
void print()
{
for (int i = 0 ;i < n ;i++)
{
printf("%d",v[i]);
if (i != n - 1) printf(" ");
else printf("\n");
}
}
void DFS(int index)
{
if (index == n)
{
cnt++;
if (cnt <= 3) print();
return ;
}
for (int i = 1 ;i <= n ;i++)
{
if (!hashtable[i] && !a[i + index] && !b[i - index + n])
{
v[index] = i;
a[i + index] = 1;
b[i - index + n] = 1;
hashtable[i] = 1;
DFS(index + 1);
hashtable[i] = 0;
a[i + index] = 0;
b[i - index + n] = 0;
}
}
}
int main()
{
scanf("%d",&n);
DFS(0);
printf("%d\n",cnt);
return 0;
}