搜索

题目1045:百鸡问题

http://ac.jobdu.com/problem.php?pid=1045

#include<stdio.h>

int main(){
    //1.保存总金额数
    int n;

    //2.
    while(scanf("%d",&n)!=EOF){
        //3.枚举法求解
        for(int i=0;i<n/5;i++){
            for(int j=0;j<n/3;j++){
                //3.1判断是否符合条件
                if((15*i+9*j+100-i-j)<=3*n){
                    printf("x=%d,y=%d,z=%d\n",i,j,100-i-j);
                }
            }
        }
    }

    return 0;
}

题目1456:胜利大逃亡

http://ac.jobdu.com/problem.php?pid=1456

#include<stdio.h>
#include<queue>
using namespace std;

//保存向四周扩展的数组
int go[][3]={
    1,0,0,
    0,1,0,
    0,0,1,
    -1,0,0,
    0,-1,0,
    0,0,-1
};

//保存整个立体
int area[50][50][50];
//保存是否访问过
int mark[50][50][50]={0};

//保存每个点状态的结构体
struct E{
    int x,y,z;
    int time;
};

//保存每次状态的队列
queue<E> Q;

//广度优先搜索方法
int BFS(int a,int b,int c,int time){
    //1.清空队列
    while(!Q.empty())
        Q.pop();

    //2.将初始状态加入队列
    E e;
    e.x=0;
    e.y=0;
    e.z=0;
    e.time=0;

    Q.push(e);
    mark[0][0][0]=1;

    //3.拓展周围情况
    while(!Q.empty()){
        //3.1弹出队首元素,判断是否达到
        E tem=Q.front();
        Q.pop();


        if(tem.x==a-1&&
           tem.y==b-1&&
           tem.z==c-1&&
           tem.time<=time){
                return tem.time;
        }

        if(tem.time>=time)
            return -1;

        //3.2遍历所有情况,符合情况入队
        for(int i=0;i<6;i++){
            E tem2;
            tem2.x=tem.x+go[i][0];
            tem2.y=tem.y+go[i][1];
            tem2.z=tem.z+go[i][2];
            tem2.time=tem.time+1;

            //数组已经越界
            if(!(
                0<=tem2.x&&tem2.x<a&&
                0<=tem2.y&&tem2.y<b&&
                0<=tem2.z&&tem2.z<c
               )){
                continue;
            }

            //下一步是墙,或者已经访问过
            if(area[tem2.x][tem2.y][tem2.z]==1||
               mark[tem2.x][tem2.y][tem2.z]==1)
                continue;

            Q.push(tem2);
            mark[tem2.x][tem2.y][tem2.z]=1;
        }

    }

    return -1;
}


int main(){

    //文件读入
    //freopen("data1456.txt","r",stdin);

    //1.保存测试用例的数量
    int n;
    scanf("%d",&n);
    //保存区域大小及回来时间
    int a,b,c;
    int time;

    //2.循环每次测试用例
    for(int t=0;t<n;t++){
        //3.输入区域大小及回来时间
        scanf("%d %d %d %d",&a,&b,&c,&time);

        //4.输入区域
        for(int i=0;i<a;i++){
            for(int j=0;j<b;j++){
                for(int k=0;k<c;k++){
                    scanf("%d",&area[i][j][k]);
                    mark[i][j][k]=0;
                }
            }
        }

        //5.广度优先搜索求解
        int rlt=BFS(a,b,c,time);

        //6.输出结果
        printf("%d\n",rlt);

    }

    fclose(stdin);
    return 0;
}

题目1457:非常可乐

http://ac.jobdu.com/problem.php?pid=1457

#include<stdio.h>
#include<queue>
using namespace std;

//标记是否已经存在该状态
int mark[101][101][101];

//保存状态的结构体
struct E{
    int a,b,c;
    int time;
};

//保存状态的队列
queue<E> Q;

//广度优先搜索
int BFS(int a,int b,int c){
    //1.放入初始状态
    E e;
    e.a=a;
    e.b=0;
    e.c=0;
    e.time=0;
    mark[a][0][0]=1;

    Q.push(e);

    //2.循环直到队列为空
    while(!Q.empty()){
        //2.1取出队列元素,判断是否可以
        E tem=Q.front();
        Q.pop();

        if(tem.a==tem.b&&tem.c==0 ||
           tem.a==tem.c&&tem.b==0 ||
           tem.b==tem.c&&tem.a==0
           ){
            return tem.time;
        }

        //2.2向其它方向进行扩展
        //a倒入b
        /*提取方法不成功,麻烦了*/
        if(tem.a>0&&
           tem.b<b
           ){
            E tem2;
            //可以全部倒入
            if(tem.a+tem.b<=b){
                tem2.a=0;
                tem2.b=tem.a+tem.b;
                tem2.c=tem.c;
            }else{
                tem2.a=tem.a-b+tem.b;
                tem2.b=b;
                tem2.c=tem.c;
            }

            tem2.time=tem.time+1;

            if(mark[tem2.a][tem2.b][tem2.c]==0 &&
               tem2.a>=0&&tem2.a<=a&&
               tem2.b>=0&&tem2.b<=b&&
               tem2.c>=0&&tem2.c<=c
               ){
                mark[tem2.a][tem2.b][tem2.c]=1;
                Q.push(tem2);
            }
        }
        //a倒入c
        if(tem.a>0&&
           tem.c<c
           ){
            E tem2;
            //可以全部倒入
            if(tem.a+tem.c<=c){
                tem2.a=0;
                tem2.b=tem.b;
                tem2.c=tem.a+tem.c;
            }else{
                tem2.a=tem.a-c+tem.c;
                tem2.b=tem.b;
                tem2.c=c;
            }
            tem2.time=tem.time+1;

            if(mark[tem2.a][tem2.b][tem2.c]==0 &&
               tem2.a>=0&&tem2.a<=a&&
               tem2.b>=0&&tem2.b<=b&&
               tem2.c>=0&&tem2.c<=c
               ){
                mark[tem2.a][tem2.b][tem2.c]=1;
                Q.push(tem2);
            }
        }
        //b倒入c
        if(tem.b>0&&
           tem.c<c
           ){
            E tem2;
            //可以全部倒入
            if(tem.b+tem.c<=c){
                tem2.a=tem.a;
                tem2.b=0;
                tem2.c=tem.b+tem.c;
            }else{
                tem2.a=tem.a;
                tem2.b=tem.b-c+tem.c;
                tem2.c=c;
            }
            tem2.time=tem.time+1;

            if(mark[tem2.a][tem2.b][tem2.c]==0 &&
               tem2.a>=0&&tem2.a<=a&&
               tem2.b>=0&&tem2.b<=b&&
               tem2.c>=0&&tem2.c<=c
               ){
                mark[tem2.a][tem2.b][tem2.c]=1;
                Q.push(tem2);
            }
        }
        //b倒入a
        if(tem.b>0&&
           tem.a<a
           ){
            E tem2;
            //可以全部倒入
            if(tem.a+tem.b<=a){
                tem2.a=tem.a+tem.b;
                tem2.b=0;
                tem2.c=tem.c;
            }else{
                tem2.a=a;
                tem2.b=tem.b-a+tem.a;
                tem2.c=tem.c;
            }
            tem2.time=tem.time+1;

            if(mark[tem2.a][tem2.b][tem2.c]==0 &&
               tem2.a>=0&&tem2.a<=a&&
               tem2.b>=0&&tem2.b<=b&&
               tem2.c>=0&&tem2.c<=c
               ){
                mark[tem2.a][tem2.b][tem2.c]=1;
                Q.push(tem2);
            }
        }
        //c倒入a
        if(tem.c>0&&
           tem.a<a
           ){
            E tem2;
            //可以全部倒入
            if(tem.a+tem.c<=a){
                tem2.a=tem.a+tem.c;
                tem2.b=tem.b;
                tem2.c=0;
            }else{
                tem2.a=a;
                tem2.b=tem.b;
                tem2.c=tem.c-a+tem.a;
            }
            tem2.time=tem.time+1;

            if(mark[tem2.a][tem2.b][tem2.c]==0 &&
               tem2.a>=0&&tem2.a<=a&&
               tem2.b>=0&&tem2.b<=b&&
               tem2.c>=0&&tem2.c<=c
               ){
                mark[tem2.a][tem2.b][tem2.c]=1;
                Q.push(tem2);
            }
        }
        //c倒入b
        if(tem.c>0&&
           tem.b<b
           ){
            E tem2;
            //可以全部倒入
            if(tem.b+tem.c<=b){
                tem2.a=tem.a;
                tem2.b=tem.b+tem.c;
                tem2.c=0;
            }else{
                tem2.a=tem.a;
                tem2.b=b;
                tem2.c=tem.c-b+tem.b;
            }
            tem2.time=tem.time+1;

            if(mark[tem2.a][tem2.b][tem2.c]==0 &&
               tem2.a>=0&&tem2.a<=a&&
               tem2.b>=0&&tem2.b<=b&&
               tem2.c>=0&&tem2.c<=c
               ){
                mark[tem2.a][tem2.b][tem2.c]=1;
                Q.push(tem2);
            }
        }
    }
    return -1;

}

int main(){
    //1.保存3个杯子的容积
    int a,b,c;

    //2.
    while(scanf("%d %d %d",&a,&b,&c)!=EOF&&a!=0&&b!=0&&c!=0){
        //2.1排空队列
        while(!Q.empty()){
            Q.pop();
        }
        //2.2初始化mark数组
        for(int i=0;i<a;i++){
            for(int j=0;j<b;j++){
                for(int k=0;k<c;k++){
                    mark[i][j][k]=0;
                }
            }
        }

        //3.广度优先搜索
        int rlt=BFS(a,b,c);

        //4.输出结果
        if(rlt!=-1){
            printf("%d\n",rlt);
        }else{
            printf("NO\n");
        }

    }
    return 0;
}

题目1459:Prime ring problem

http://ac.jobdu.com/problem.php?pid=1459

#include<stdio.h>
#include<math.h>
using namespace std;

//素数环
int primering[18];

//记录是否访问过
int mark[18];

//检查结果是否正确
bool checkrlt(int a,int b){
    int tem=a+b;
    //判断是否是素数
    for(int i=2;i<sqrt(tem)+1;i++){
        if(tem%i==0)
            return false;
    }
    return true;
}

//深度优先遍历
void DFS(int n,int *primering,int cnt){
    //1.查看当前结果是否符合条件
    if(cnt==n){
        //1.1符合,打印结果
        if(checkrlt(primering[1],primering[cnt])){
            for(int i=1;i<n;i++){
                printf("%d ",primering[i]);
            }
            printf("%d\n",primering[n]);
        }
        return;
    }

    //2.继续扩展
    for(int i=2;i<=n;i++){
        //2.1当前数字已经使用
        if(mark[i]!=0)
            continue;

        //2.2未使用,深入
        if(checkrlt(i,primering[cnt])){
            mark[i]=1;
            primering[cnt+1]=i;
            DFS(n,primering,cnt+1);
            mark[i]=0;
        }
    }
}

int main(){
    //1.保存输入的数字
    int n;
    //统计打印次数
    int cnt=0;

    //2.
    while(scanf("%d",&n)!=EOF){
        //3清空素数环
        for(int i=1;i<=n;i++){
            primering[i]=0;
            mark[18]=0;
        }

        //4.输出结果
        cnt++;
        printf("Case %d:\n",cnt);
        primering[1]=1;
        DFS(n,primering,1);
        printf("\n");
    }

    return 0;
}

题目1460:Oil Deposit

http://ac.jobdu.com/problem.php?pid=1460

#include<stdio.h>

//周围扩展数组
int go[][2]={
    1,0,
    0,1,
    -1,0,
    0,-1,
    1,1,
    1,-1,
    -1,1,
    -1,-1
};

//存放油田
char oil[101][101];

//存放访问标记
int mark[101][101];

//深度优先搜索
void DFS(int m,int n,int i,int j,int (&mark)[101][101],char (&oil)[101][101]){
    //1.标记该块
    mark[i][j]=1;

    //2.向周围扩展
    for(int k=0;k<8;k++){
        //避免越界
        if(i+go[k][0]>=1&&i+go[k][0]<=m&&
           j+go[k][1]>=1&&j+go[k][1]<=n
           ){
            if(mark[i+go[k][0]][j+go[k][1]]==1||oil[i+go[k][0]][j+go[k][1]]=='*')
                continue;
            else
                DFS(m,n,i+go[k][0],j+go[k][1],mark,oil);
        }
    }

}

int main(){
    //1.保存油田的行数m,列数n
    int m,n;

    //freopen("data1460.txt","r",stdin);

    //2.
    while(scanf("%d %d",&m,&n)!=EOF&&m!=0){
        //2.1初始化信息
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                mark[i][j]=0;
            }
        }

        //3.开始输入油田
        for(int i=1;i<=m;i++){
            scanf("%s",oil[i]+1);
        }
        //4.开始对每个油块深度搜索,无返回标记
        int cnt=0;

        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                //判断是否为油田,以及是否被标记过
                if(mark[i][j]==1||oil[i][j]=='*')
                    continue;
                //开始深度搜索并标记
                DFS(m,n,i,j,mark,oil);
                cnt++;
            }
        }

        //5.输出结果
        printf("%d\n",cnt);

    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值