搜索专题小组题解

题外话,第一次知道运行错误可能是由于数组开小导致的。。

A - 棋盘问题

#include <bits/stdc++.h>
using namespace std;
char a[15][15];
int you,n,ans,k,book[15];
void dfs(int h){
	if(you==k){
		ans++;
		return;
	}
	if(h>=n)
		return;
	for(int i=0;i<n;i++){
		if(book[i]!=0)
			continue;
		if(a[h][i]=='#'&&book[i]==0){
			book[i]=1;
			you++;
			dfs(h+1);
			book[i]=0;
			you--;	
		}
	}
	dfs(h+1);	
	
}
int main(){

	while(scanf("%d%d",&n,&k)!=EOF){
		if(n==-1&&k==-1)
			break;
		ans=0;
		you=0;
		memset(book,0,sizeof(book));
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				cin>>a[i][j];
		dfs(0);
		cout<<ans<<"\n";
	}
	return 0;
}

B - Perket

#include <bits/stdc++.h>
using namespace std;
int s[15],b[15],book[15];
int n,mi=999999,sums=1,sumb=0,ans;
void dfs(int group){
	if(group<=n){
		for(int i=1;i<=n;i++){
			if(book[i]==0){
				sums*=s[i];
				sumb+=b[i];
				if(abs(sums-sumb)<mi)
					mi=abs(sums-sumb);
				book[i]=1;
				dfs(group+1);
				book[i]=0;
				sums/=s[i];
				sumb-=b[i];
			}
		}
	}
	
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>s[i]>>b[i];
	dfs(1);
	cout<<mi; 
	return 0;
}

C - 全排列

#include <bits/stdc++.h>
using namespace std;
char a[10];
int main()
{
    gets(a);
    int len=strlen(a);
    do{
        puts(a);
    }while(next_permutation(a,a+len));
    return 0;
}

G - Knight Moves

#include <bits/stdc++.h>
using namespace std;
int head,tail;
int book[310][310];
int ne[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
struct note{
	int x;
	int y;
	int step;
}que[90010];
int main(){
	int L,startx,starty,p,q,tx,ty,flag;
	int n;
	cin>>n;
	while(n--){
		memset(book,0,sizeof(book));

		cin>>L;
		cin>>startx>>starty>>p>>q;
	
		head=1;
		tail=1;
	
		que[tail].x=startx;
		que[tail].y=starty;
		que[tail].step=0;
		tail++;
		book[startx][starty]=1;
	
		flag=0;
		while(head<tail){
			for(int k=0;k<8;k++){
				tx=que[head].x+ne[k][0];
				ty=que[head].y+ne[k][1];
				if(tx<0 || ty<0 || tx>L || ty>L)
					continue;
				if(book[tx][ty]==0){
					book[tx][ty]=1;
					que[tail].x=tx;
					que[tail].y=ty;
					que[tail].step=que[head].step+1;
					tail++;			
				}
				if(tx==p && ty==q){
					flag=1;
					break;
				}
			}
			if(flag)
				break;
			head++;
		}
		if(startx==p && starty==q)
			cout<<"0\n";
		else
			cout<<que[tail-1].step<<"\n";
	}
	return 0;
}

K - 迷宫(一)

#include <bits/stdc++.h>
using namespace std;
char a[10][10];
int book[15][15],n,m,flag,p,q;
void dfs(int x,int y){
	int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
	int tx,ty;
	if(x==p&&y==q){
		flag=1;
		return;
	}
	for(int k=0;k<=3;k++){
		tx=x+next[k][0];
		ty=y+next[k][1];
		if(tx<1 || tx>n || ty<1 ||ty>m)
			continue;
		if( (a[tx][ty]=='.'|| a[tx][ty]=='T') && book[tx][ty]==0){
			book[tx][ty]=1;
			dfs(tx,ty);
			book[tx][ty]=0;
		}
	}
	return;
}
int main(){
	int sx,sy;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			if(a[i][j]=='T'){
				p=i;
				q=j;
			}
			if(a[i][j]=='S'){
				sx=i;
				sy=j;
			}
			
		}
	book[sx][sy]=1;
	dfs(sx,sy);
	if(flag)
		cout<<"yes\n";
	else
		cout<<"no\n";
	return 0;
}

M - 八皇后问题

#include<iostream>
using namespace std;
const int N=18;
int a[N][N];
bool col[N];
bool g[N],ug[N];
int ans;
int m=0;
void dfs(int t)
{
	if(t==8)
	{
		m=max(m,ans);
		return ;
	}
	for(int i=0;i<8;i++)
	{
		if(!col[i]&&!g[t-i+8]&&!ug[t+i])
		{
			ans+=a[t][i];
			col[i]=g[t-i+8]=ug[t+i]=1;
			dfs(t+1);
			col[i]=g[t-i+8]=ug[t+i]=0;
			ans-=a[t][i];
		}
	}
}
int main()
{
	int k;
	cin>>k;
	while(k--)
	{
		m=0;
		ans=0;
		g[N]=0;
		ug[N]=0;
		for(int i=0;i<8;i++)
		{
			for(int j=0;j<8;j++)
			cin>>a[i][j];
		}
		dfs(0);
		cout<<m<<endl;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值