1、素数环
#include<bits/stdc++.h>
using namespace std;
int a[20];
int b[20];
int cnt=0;
int n;
int isPrime(int x){if(x<=0)return 0;if(x==2)return 1;if(x%2==0)return 0;for(int i=3;i*i<=x;i+=2){if(x%i==0){return 0;}}return 1;
}
void dfs(int k){if(k==n+1){if(isPrime(a[1]+a[n])){cnt++;}return;}for(int i=2;i<=n;i++){if(b[i]==0&&isPrime(i+a[k-1])){a[k]=i;b[i]=1;dfs(k+1);b[i]=0;}}
}
int main(){cin>>n;a[1]=1;b[1]=1;dfs(2);cout<<cnt<<endl;return 0;
}
2、迷宫求路径次数
#include<bits/stdc++.h>
using namespace std;
int m,n,ans;
int a[30][30];
int b[30][30];
int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
int check(int x,int y){if(b[x][y]==0&&a[x][y]==0&&x>=1&&x<=m&&y>=1&&y<=n){return 1;}else return 0;
}
void dfs(int x,int y){if(x==m&&y==n){ans++;return;}for(int i=0;i<4;i++){int a=x+dir[i][0];int d=y+dir[i][1];if(check(a,d)){b[a][d]=1;dfs(a,d);b[a][d]=0;}}
}
int main(){cin>>m>>n;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){cin>>a[i][j];}}b[1][1]=1;dfs(1,1);cout<<ans;return 0;
}
3、实现迷宫路径判断
#include<bits/stdc++.h>
using namespace std;
int n; // 迷宫大小n*n
char a[105][105]; // 存储迷宫地图
int b[105][105]; // 标记是否访问过
int ha, la, hb, lb; // 起点和终点坐标
int flag; // 标记是否找到路径
int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}}; // 四个方向// 检查坐标是否合法且可通行
int check(int x,int y){if(b[x][y]==0 && a[x][y]=='.' && x>=0 && x<n && y>=0 && y<n){return 1;}else return 0;
}// DFS搜索路径
void dfs(int x,int y){// 如果到达终点,标记找到路径if(x==hb && y==lb){flag=1;return;}// 如果已经找到路径,提前返回if(flag) return;// 尝试四个方向for(int i=0;i<4;i++){int nx=x+dir[i][0];int ny=y+dir[i][1];if(check(nx,ny)){b[nx][ny]=1; // 标记为已访问dfs(nx,ny);// 不需要回溯标记,因为只要找到一条路径即可if(flag) return; // 找到路径后提前返回}}
}int main(){int k; // 测试数据组数cin>>k;while(k--){cin>>n;// 读取迷宫for(int i=0;i<n;i++){cin>>a[i];}// 读取起点和终点cin>>ha>>la>>hb>>lb;// 初始化标记数组和结果标记memset(b,0,sizeof(b));flag=0;// 检查起点和终点是否可通行if(a[ha][la]!='.' || a[hb][lb]!='.'){cout<<"NO"<<endl;continue;}// 从起点开始DFSb[ha][la]=1;dfs(ha,la);// 输出结果if(flag) cout<<"YES"<<endl;else cout<<"NO"<<endl;}return 0;
}
4、走迷宫
#include<bits/stdc++.h>
using namespace std;
int R,C,ans;
char a[45][45]; // 存储迷宫
int b[45][45]; // 存储步数,同时标记是否访问过
int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}};// 检查坐标是否合法且可通行
int check(int x,int y){if(b[x][y]==0 && a[x][y]=='.' && x>=0 && x<R && y>=0 && y<C){return 1;}else return 0;
}// BFS寻找最短路径
void bfs(){// 使用队列存储坐标,用结构体数组模拟队列操作struct Node {int x; int y;} q[1605]; // 最大可能节点数为40*40=1600int head=0,tail=0;// 起点入队(左上角)q[tail].x=0;q[tail].y=0;tail++;b[0][0]=1; // 起点步数为1while(head<tail){// 取出队首元素int x=q[head].x;int y=q[head].y;head++;// 如果到达终点(右下角),记录答案并返回if(x==R-1 && y==C-1){ans=b[x][y];return;}// 尝试四个方向for(int i=0;i<4;i++){int nx=x+dir[i][0];int ny=y+dir[i][1];if(check(nx,ny)){b[nx][ny]=b[x][y]+1; // 步数加1q[tail].x=nx;q[tail].y=ny;tail++;}}}
}int main(){cin>>R>>C;// 读取迷宫for(int i=0;i<R;i++){cin>>a[i];}// 初始化步数数组for(int i=0;i<R;i++){for(int j=0;j<C;j++){b[i][j]=0;}}// 求解最短路径bfs();// 输出结果cout<<ans<<endl;return 0;
}
5、n皇后
#include<bits/stdc++.h>
using namespace std;
int n;
int a[10];
int cnt=0;
int check(int r,int c){for(int i=0;i<r;i++){if(a[i]==c||abs(i-r)==abs(a[i]-c)){return 0;} }return 1;
}
void dfs(int r){if(r==n){cnt++;for(int i=0;i<n;i++){cout<<a[i]+1<<" ";}cout<<endl;return;}for(int c=0;c<n;c++){if(check(r,c)){a[r]=c;dfs(r+1);}}
}
int main(){cin>>n;dfs(0);cout<<cnt<<endl;return 0;
}
6、blocks积木
#include<bits/stdc++.h>
using namespace std;
char a[4][6];
bool b[4];
string words;
bool f;
void dfs(int p){if(p==words.size()){f=true;return;}for(int i=0;i<4;i++){if(b[i])continue;for(int j=0;j<6;j++){if(a[i][j]==words[p]){b[i]=true;dfs(p+1);if(f)return;b[i]=false;}}}
}
int main(){int n;cin>>n;for(int i=0;i<4;i++){cin>>a[i];}for(int i=0;i<n;i++){cin>>words;if(words.size()>4){cout<<"NO"<<endl;continue;}f=false;for(int j=0;j<4;j++){b[j]=false;}dfs(0);if(f){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}}return 0;
}