#1.棋盘问题
八皇后问题
void generateP(int index){
if(index==n+1) {
count++;
return ;
}
for(int x=1;x<=n;x++) {
if(hashTable[x]==false) {
bool flag=true;
for(int pre=1;pre<index;pre++) {
if(abs(index-pre)==abs(x-P[pre])) {
flag=false;
break;
}
}
if(flag) {
P[index]=x;
hashTable[x]=true;
generateP(index+1);
hashTable[x]=false;
}
}
}
}
八皇后变形,不用每行都放满,放满k个就好了
每一行有选和不选两种,然后枚举选第几列
dfs状态参数(对第几行作选择,已经放了多少个)
不需要把列也作为参数,col数组已经记录了
#include<iostream>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=10;
char g[maxn][maxn];
bool col[maxn];
int n,k,ans;
void dfs(int x,int t){
if(t==k) {
ans++;
return ;
}
if(x==n) return ;
for(int i=0;i<n;i++){
if(col[i]||g[x][i]!='#') continue;
col[i]=1;
dfs(x+1,t+1);
col[i]=0;
}
dfs(x+1,t);
}
int main(){
while(~scanf("%d%d",&n,&k)) {
if(n==-1&&k==-1) break;
for(int i=0;i<n;i++) scanf("%s",g[i]);
ans=0;
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}
#2.Dungeon Master
三维BFS模板
#include<iostream>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=35;
char g[maxn][maxn][maxn];
bool vis[maxn][maxn][maxn];
int dist[maxn][maxn][maxn];
int sx,sy,sz,ex,ey,ez;
int L,R,C;
struct Node{
int x,y,z;
};
int dx[]={1,-1,0,0,0,0};
int dy[]={0,0,1,-1,0,0};
int dz[]={0,0,0,0,1,-1};
bool flag;
void bfs(int sz,int sx,int sy) {
memset(dist,0x3f,sizeof(dist));
Node input;
input.z=sz,input.x=sx,input.y=sy;
queue<Node>q;
q.push(input);
vis[sz][sx][sy]=1;
dist[sz][sx][sy]=0;
while(!q.empty()) {
Node t=q.front();
q.pop();
if(t.z==ez&&t.x==ex&&t.y==ey){
flag=1;
break;
}
for(int i=0;i<6;i++){
int a=t.z+dz[i];
int b=t.x+dx[i];
int c=t.y+dy[i];
if(a<0||b<0||c<0||a>=L||b>=R||c>=C)continue;
if(vis[a][b][c]||g[a][b][c]=='#')continue;
vis[a][b][c]=1;
Node tmp;
tmp.z=a,tmp.x=b,tmp.y=c;
q.push(tmp);
dist[a][b][c]=dist[t.z][t.x][t.y]+1;
}
}
}
int main(){
while(~scanf("%d%d%d",&L,&R,&C)&&(L||R||C)){
for(int i=0;i<L;i++)
for(int j=0;j<R;j++)
for(int k=0;k<C;k++){
cin>>g[i][j][k];
if(g[i][j][k]=='S')sz=i,sx=j,sy=k;
if(g[i][j][k]=='E')ez=i,ex=j,ey=k;
}
memset(vis,0,sizeof(vis));
flag=0;
bfs(sz,sx,sy);
if(flag) printf("Escaped in %d minute(s).\n",dist[ez][ex][ey]);
else cout<<"Trapped!"<<endl;
}
}
#11.迷宫问题
二维BFS打印路径模板
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
bool vis[5][5];
int a[5][5];
struct Node{
int x,y,s;
short l[30];
};
bool judge(int x,int y){
if(x<0||x>=5||y<0||y>=5) return true;
if(vis[x][y]) return true;
if(a[x][y]==1) return true;
return false;
}
Node bfs(){
queue<Node> q;
Node cur,next;
cur.x=0;
cur.y=0;
cur.s=0;
vis[cur.x][cur.y]=true;
q.push(cur);
while(!q.empty()){
cur=q.front();
q.pop();
if(cur.x==4&&cur.y==4) return cur;
for(int i=0;i<4;i++){
int nx=cur.x+dx[i];
int ny=cur.y+dy[i];
if(judge(nx,ny)) continue;
next=cur;
next.x=nx;
next.y=ny;
next.s=cur.s+1;
next.l[cur.s]=i;
q.push(next);
}
}
return cur;
}
int main(){
for(int i=0;i<5;i++){
for(int j=0;j<5;j++) {
scanf("%d",&a[i][j]);
}
}
Node ans=bfs();
int x=0,y=0;
for(int i=0;i<=ans.s;i++){
printf("(%d, %d)\n",x,y);
x+=dx[ans.l[i]];
y+=dy[ans.l[i]];
}
return 0;
}
#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#include<stdio.h>
using namespace std;
const int maxn=5;
int g[maxn][maxn];
bool vis[maxn][maxn];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
struct Node{
int x,y;
string s;
};
void bfs(){
queue<Node> q;
q.push({0,0,"00"});
vis[0][0]=1;
while(!q.empty()) {
Node t=q.front();
q.pop();
if(t.x==4&&t.y==4) {
int len=t.s.size();
for(int i=0;i<len;i+=2){
printf("(%c, %c)\n",t.s[i],t.s[i+1]);
}
}
for(int i=0;i<4;i++){
int a=t.x+dx[i],b=t.y+dy[i];
if(a<0||b<0||a>=5||b>=5)continue;
if(g[a][b]==1||vis[a][b])continue;
char c=a+'0';
char d=b+'0';
string p=t.s+c+d;
q.push({a,b,p});
vis[a][b]=1;
}
}
}
int main(){
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
scanf("%d",&g[i][j]);
bfs();
return 0;
}
12.油田
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m;
char map1[105][105];
int dir[8][2]={
{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}
} ;
void dfs(int x,int y){
if(map1[x][y]=='@') map1[x][y]='*';
for(int i=0;i<8;i++){
int a=x+dir[i][0];
int b=y+dir[i][1];
if(map1[a][b]=='@'&&a<n&&a>=0&&b<m&&b>=0)
dfs(a,b);//进行搜索
}
}
int main(){
while(scanf("%d %d",&n,&m)&&n!=0&&m!=0){
getchar();
int sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
//scanf("%c",&map1[i][j]);
cin>>map1[i][j];
}
//getchar();
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(map1[i][j]=='@') {
dfs(i,j);
sum++;
}
}
}
printf("%d\n",sum);
}
}