kuangbin专题一 简单搜索

#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);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值