【哈工程ACM选修课】深度优先搜索

A. 最大黑色区域

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<stack>
#include<math.h>
#include<string.h>
#include<stdlib.h>
 
using namespace std;
typedef long long ll;
int n,m,sum,k;
int a[105][105];
int visited[105][105];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
 
struct node{
    int i,j;
};
 
void bfs(int i,int j){
    queue<node> q;
    node t,next;
    t.i=i;
    t.j=j;
    q.push(t);
    visited[i][j]=1;
    sum++;
    while(!q.empty()){
        t=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int xx=t.i+dx[i];
            int yy=t.j+dy[i];
            if(xx<0||xx>=n||yy<0||yy>=m||visited[xx][yy]||a[xx][yy]==0)
                continue;
            visited[xx][yy]=1;
            next.i=xx;
            next.j=yy;
            q.push(next);
            sum++;
        }
    }
    if(sum>k)
        k=sum;
}
 
int main(){
    scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++){
            	char c;cin>>c;
            	a[i][j]=(int)c-48;
            	//cout<<a[i][j];
			}
                
        memset(visited,0,sizeof(visited));
        k=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(!visited[i][j]&&a[i][j]==1){
                    sum=0;
                    bfs(i,j);
                }
        printf("%d\n",k);
    
}

B. 门票问题

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int l,c;
char str[27];
int book[27];
int a[27],pd;
int step=0;
void dfs(int ans,int ans_yuan,int ans_fu) {//深搜
    int i,j;
    if(step>=25000)return;//输出前25000个答案
    if(ans==l+1) {
        if(ans_yuan>=1&&ans_fu>=2) {//判断原音辅音
            ++step;
            if(pd==1)cout<<endl;//处理换行
            else pd=1;
            for(int j=1; j<=l; j++) {
                cout<<str[a[j]];//输出
            }
        }
        return;
    }
    for(i=a[ans-1]+1; i<=c; i++) {
        if(book[i]==0) {
            book[i]=1;//标记置1
            a[ans]=i;
            if(str[i]=='a'||str[i]=='e'||str[i]=='i'||str[i]=='o'||str[i]=='u')dfs(ans+1,ans_yuan+1,ans_fu);//元音个数+1
            else dfs(ans+1,ans_yuan,ans_fu+1);//辅音个数+1
            book[i]=0;//回溯
        }
    }
}
int main() {
    int i;
    cin>>l>>c;
    for(i=1; i<=c; i++)cin>>str[i];//输入
    sort(str+1,str+c+1);//按字典序排序
    dfs(1,0,0);
}

C. 图的遍历

#include<iostream>
#include <algorithm>
#include<vector>
using namespace std;
int n;
int a[21][21];
int dfs(vector<int>ans,int x,int n,int a[][21]){
	for(int i=0;i<n;i++){
		if(a[x][i]==1){
			//cout<<"查到"<<x<<","<<i<<endl;
			vector<int>::iterator result=find(ans.begin( ),ans.end( ),i);
			if (result==ans.end( )){
				ans.push_back(i);
				//cout<<"正常遍历到"<<i<<endl; 
				cout<<"-"<<i+1;
				return dfs(ans,i,n,a);
				break;
			}
		}
		else{
			if(i==n-1){
				for(int i=0;i<n;i++){
					vector<int>::iterator result=find(ans.begin( ),ans.end( ),i);
					if (result==ans.end( )){
						ans.push_back(i);
						cout<<"-"<<i+1;
						//cout<<"异常遍历到"<<i<<endl; 
						return dfs(ans,i,n,a);
					}
				}
			}
		}
	}
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>a[i][j];
		}
	}
	vector<int>ans;
	ans.push_back(0);
	cout<<"1";
	dfs(ans,0,n,a);
	
}

D. 速算游戏

#include<iostream>
#include<algorithm>
#include <cstdio>
#include <cstring> 
#include <cstdlib>
#include <vector>
using namespace std;
vector<string>ans;
int calc(int a,int b,char x){
	switch(x){
		case'+':{
			//cout<<a<<"+"<<b<<endl;
			return (int)(a+b);
			break;
		}
		case'-':{
			//cout<<a<<"-"<<b<<endl;
			return (int)(a-b);
			break;
		}
		case'*':{
			//cout<<a<<"*"<<b<<endl;
			return (int)(a*b);
			break;
		}
		case'/':{
			if(b!=0){
				//cout<<a<<"/"<<b<<endl;
				return (int)(a/b);
			}
			else{
				return 0;
			}
			break;
		}
		case'^':{
			//cout<<a<<"^"<<b<<endl;
			return (int)(a^b);
			break;
		}
		case'&':{
			//cout<<a<<"&"<<b<<endl;
			return (int)(a&b);
			break;
		}
		case'|':{
			//cout<<a<<"|"<<b<<endl;
			return (int)(a|b);
			break;
		}
	}
}

int main(){
	char arr[7]={'+','-','*','/','^','&','|'};
	string s;cin>>s;
	sort(s.begin(), s.end());
	while(next_permutation(s.begin(),s.end())){
		//cout<<s<<endl;
		// s[0] s1   s2  s3
		// ((A   @   B)  @   C)  @   D
		//  (A   @   B)  @  (C   @   D)
		//  (A   @  (B   @   C)) @   D
		//   A   @ ((B   @   C)  @   D)
		//   A   @  (B   @  (C   @   D))
		int a[3];
		for(int i=0;i<4;i++){
			switch(s[i]){
				case'A':{
					a[i]=1;
					break;
				}
				case'T':{
					a[i]=10;
					break;
				}
				case'J':{
					a[i]=11;
					break;
				}
				case'Q':{
					a[i]=12;
					break;
				}
				case'K':{
					a[i]=13;
					break;
				}
				default:{
					a[i]=s[i]-48;
					break;
				}
			}
		}
		//for(int i=0;i<4;i++)cout<<a[i]<<" ";cout<<endl;
		for(int i=0;i<7;i++)
		for(int j=0;j<7;j++)
		for(int k=0;k<7;k++){
			if(calc(calc(calc(a[0],a[1],arr[i]),a[2],arr[j]),a[3],arr[k])==24){
				string ansstr="";
				ansstr=ansstr+"((("+s[0]+arr[i]+s[1]+")"+arr[j]+s[2]+")"+arr[k]+s[3]+")";
				//cout<<ansstr<<endl;
				ans.push_back(ansstr);
			}
			if(calc(calc(a[0],a[1],arr[i]),calc(a[2],a[3],arr[k]),arr[j])==24){
				string ansstr="";
				ansstr=ansstr+"(("+s[0]+arr[i]+s[1]+")"+arr[j]+"("+s[2]+arr[k]+s[3]+"))";
				//cout<<ansstr<<endl;
				ans.push_back(ansstr);
			}
			if(calc(a[3],calc(a[0],calc(a[1],a[2],arr[j]),arr[i]),arr[k])==24){
				string ansstr="";
				ansstr=ansstr+"(("+s[0]+arr[i]+"("+s[1]+arr[j]+s[2]+"))"+arr[k]+s[3]+")";
				//cout<<ansstr<<endl;
				ans.push_back(ansstr);
			}
			if(calc(a[0],calc(a[3],calc(a[1],a[2],arr[j]),arr[k]),arr[i])==24){
				string ansstr="";
				ansstr=ansstr+"("+s[0]+arr[i]+"(("+s[1]+arr[j]+s[2]+")"+arr[k]+s[3]+"))";
				//cout<<ansstr<<endl;
				ans.push_back(ansstr);
			}
			//   A   @  (B   @  (C   @   D))
			//(a[0]arr[i](a[1]arr[j](a[2]arr[k]a[3])))
			if(calc(calc(calc(a[2],a[3],arr[k]),a[1],arr[j]),a[0],arr[i])==24){
				string ansstr="";
				ansstr=ansstr+"("+s[0]+arr[i]+"("+s[1]+arr[j]+"("+s[2]+arr[k]+s[3]+")))";
				//cout<<ansstr<<endl;
				ans.push_back(ansstr);
			}
		}
	}
	sort(ans.begin(),ans.end());
	cout<<ans[0];
}

E. 生日购物

#include<iostream>
#include<stdio.h>
#include<vector>
#include<list>
using namespace std;
list<int> list1;
vector<int>ans;
void GetNSum(vector<int>a,int k, int n)
{
	if(k == a[n-1])
	{
		list<int>::iterator it;
		for(it = list1.begin();it!=list1.end();it++)
		{
			//cout<<*it<<" ";
			ans.push_back(*it);
		}
		//cout<<a[n-1]<<endl;
		return;
	}
	else if(n<=0) return;
	else 
	{
		GetNSum(a,k,n-1);
		//---------------------------
		list1.push_front(a[n-1]);
		GetNSum(a,k-a[n-1],n-1);
		list1.pop_front();
	}
 
}
int main()
{
	int n,x;
	while(scanf("%d %d",&n,&x)!=EOF){
		vector<int>a;
		for(int i=0;i<n;i++){
			int x;cin>>x;
			a.push_back(x);
		}
		GetNSum(a,x,n);
		if(ans.empty())cout<<"NO"<<endl;
		else cout<<"YES"<<endl;
		ans.clear();
	}
	
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值