B3625 迷宫寻路
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
char a[110][110],//稍微开大一点
s1[4]={1,-1,0,0},s2[4]={0,0,1,-1};//四个方向
bool flag[110][110];//数组flag来标记有没有走过
void dfs(int x,int y){//核心部分
flag[x][y]=1;//标记走过
for(int i=0;i<4;i++)
if(x+s1[i]>=1&&x+s1[i]<=n&&y+s2[i]>=1&&y+s2[i]<=m&&a[x+s1[i]][y+s2[i]]=='.'&&flag[x+s1[i]][y+s2[i]]==0)//如果能走并且没走过
dfs(x+s1[i],y+s2[i]);//就搜索
return ;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) cin>>a[i][j];//输入
dfs(1,1);//从起点开始搜索
if(flag[n][m]==1) cout<<"Yes";//判定
else cout<<"No";
return 0;
}
解析:
BFS
P1706 全排列问题
代码:
#include<bits/stdc++.h>
using namespace std;
int gd[15],a[15],n;//gd判断该数是否用过
void pt(){
for(int i=1;i<=n;i++) printf("%5d",a[i]);//%5d是占5个场宽
printf("\n");
}
void dfs(int dee){//Depth First Search
if(dee>n){
pt();return;
}
for(int i=1;i<=n;i++){
if(!gd[i]){
gd[i]=1;
a[dee]=i;
dfs(dee+1);
gd[i]=0;
}
}
return;
}
int main(){
scanf("%d",&n);
dfs(1);
return 0;
}
解析:
BFS,用数组记录每一行
P1451 求细胞数量
代码:
#include<bits/stdc++.h>//万能头
using namespace std;
int m,n,coun=0;//横轴,纵轴,计数
int ma[101][101],a[101][101];//地图数组和是否走过数组
int dx[4]={0,0,1,-1};//横轴移动数组
int dy[4]={1,-1,0,0};//纵轴移动数组
struct node{
int x;//队列.横轴
int y;//队列.纵轴
}q[10001];//队列queue的缩写q
void bfs(int sx,int sy)
{
coun++;//计数器++
q[1].x=sx;q[1].y=sy;//先入队
int hea=0,tai=1;//队头,队尾
while(hea<tai)//
{
hea++;//入队
a[q[hea].x][q[hea].y]=1;//标记为已走过
for(int i=0;i<=3;i++)
{
int tx=q[hea].x+dx[i],ty=q[hea].y+dy[i];
if(tx>=1&&tx<=m&&ty>=1&&ty<=n&&ma[tx][ty]==1&&a[tx][ty]==0)//判断是否越界或者没走过或者是否为细胞
{
tai++;//加入队尾等待处理
q[tai].x=tx;q[tai].y=ty;
}
}
}
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
scanf("%1d",&ma[i][j]);//每个数组变量只读取一位
if(ma[i][j]!=0) ma[i][j]=1;//如果不是细胞就为1
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
a[i][j]=0;//把是否走过数组重置为0
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(ma[i][j]==1&&a[i][j]==0)
{
bfs(i,j);//BFS
}
}
printf("%d",coun);//输出计数器
return 0;
}
解析:
BFS
P1219 [USACO1.5] 八皇后 Checker Challenge
代码:
#include<cstdio>
#include<iostream>
using namespace std;
int ans[14],check[3][28]={0},sum=0,n;
void eq(int line)
{
if(line>n)
{
sum++;
if(sum>3) return;
else
{
for(int i=1;i<=n;i++) printf("%d ",ans[i]);
printf("\n");
return;
}
}
for(int i=1;i<=n;i++)
{
if((!check[0][i])&&(!check[1][line+i])&&(!check[2][line-i+n]))
{
ans[line]=i;
check[0][i]=1; check[1][line+i]=1; check[2][line-i+n]=1;
eq(line+1);
check[0][i]=0; check[1][line+i]=0; check[2][line-i+n]=0;
}
}
}
int main()
{
scanf("%d",&n);
eq(1);
printf("%d",sum);
return 0;
}
解析:
朴实的DFS