【洛谷B3625】迷宫寻路
最开始TLE了四个点。最后受评论区启发删去了每次return后重新改为'.'的操作,毕竟已经确定这个格子连着的所有路都走不通。有点bfs的意思?
#include <bits/stdc++.h>
using namespace std;
char a[110][110];
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
int n,m,flag=0,x,y;
void dfs(int si,int sj);
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
cin>>a[i][j];
}
if(a[n-1][m]=='.'||a[n][m-1]=='.'){
a[1][1]=='#';
dfs(1,1);
}
if(flag)
cout<<"Yes";
else
cout<<"No";
return 0;
}
void dfs(int si,int sj){
if(si==n&&sj==m)
flag=1;
if(flag)return;
for(int i=0;i<4;i++){
x=si+dx[i];y=sj+dy[i];
if(a[x][y]=='.'){
a[x][y]='#';
dfs(x,y);
//a[x][y]='.';
}
}
}
【洛谷P1706】全排列问题
#include <bits/stdc++.h>
using namespace std;
int n,flag[20]={0},num[20];
void arr(int step){
if(step>n){
for(int i=1;i<=n;i++){
printf("%5d",num[i]);
}
cout<<endl;
return ;
}
for(int i=1;i<=n;i++){
if(flag[i]==1)continue;
flag[i]=1;
num[step]=i;
arr(step+1);
flag[i]=0;
}
}
int main(){
cin>>n;
arr(1);
return 0;
}
【洛谷P1451】求细胞数量
#include <bits/stdc++.h>
using namespace std;
int n,m,sum=0;
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
char a[110][110];
void dfs(int i,int j);
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]!='0'){
dfs(i,j);
sum++;
}
}
}
cout<<sum;
return 0;
}
void dfs(int i,int j){
a[i][j]='0';
for(int k=0;k<4;k++){
int x=i+dx[k],y=j+dy[k];
if(a[x][y]>'0'&&a[x][y]<='9')
dfs(x,y);
}
}
【洛谷P1219】八皇后
一开始采用的是在arr里边搞两层循环每一格地搜,但是一个是怕TLE,再就是不知道为什么会输出好几遍同一个解,所以最后改成每一层递归是一行,在下面搜索该行的每一列
#include <bits/stdc++.h>
using namespace std;
int n,y[20]={0},a[30]={0},b[30]={0},num[20];//num 第几行
//a主对角线 b副对角线
int sum=0;
void arr(int i){//每一行搜索
if(i>n){
if(sum<3){
for(int i=1;i<=n;i++){
cout<<num[i]<<' ';
}
cout<<endl;
}
sum++;
return ;
}
for(int j=1;j<=n;j++){
if(y[j]==1)continue;
if(a[n+i-j]==1||b[i+j]==1)continue;
num[i]=j;
y[j]=1;
a[n+i-j]=1;b[i+j]=1;
arr(i+1);
y[j]=0;
a[n+i-j]=0;b[i+j]=0;
}
}
int main(){
cin>>n;
arr(1);
cout<<sum;
return 0;
}