日之结3.19

简单搜索&&进阶搜索 - Virtual Judge

思路:一道dfs的题,每个城市确保只走一次,并且最后回到起点,注意一下输出的格式(多个空格,以及输入的格式),在每次返回后去除标记

#include<stdio.h>
int a[22][5]={0};
int book[22]={0};
int step,count=0;
int ans[22];
int m;
void putf()
{
    printf("%d:  ",++count);
    for(int i=0;i<=19;i++)
        printf("%d ",ans[i]);
    printf("%d\n",ans[20]);
}
void dfs(int i,int step)
{
    ans[step]=i;
    if(step==20&&ans[20]==m){putf();return ;}
    for(int j=1;j<=3;j++){
        if(book[a[i][j]]==0){
            book[a[i][j]]=1;
            dfs(a[i][j],step+1);
            book[a[i][j]]=0;
        }
    }

}

int main()
{
    for(int i=1;i<=20;i++){
        scanf("%d %d %d",&a[i][1],&a[i][2],&a[i][3]);
    }


    while(scanf("%d",&m),m){
count=0;
    for(int i=0;i<=22;i++)book[i]=0;
            dfs(m,0);
}
}

简单搜索&&进阶搜索 - Virtual Judge

思路:这道题可以用双bfs来做,俩人同时进行bfs,存下到达餐厅时的时间,当都搜索到同一个餐厅时,判断是不是最短路径,是则更新最短时间,搜索完成后输出即可

#include<stdio.h>
int n,m;
struct node
{
    int x;
    int y;
    int ans;
}e1[40000],e2[40000];
char map[205][205];
int a1[205][205],a2[205][205];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};

void ddd()
{

}
int main()
{

    int x1,x2,y1,y2;
    while(scanf("%d %d",&n,&m)!=EOF){
    getchar();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            a1[i][j]=0;
            a2[i][j]=0;
            scanf("%c",&map[i][j]);
            if(map[i][j]=='Y'){x1=i;y1=j;}
            else if(map[i][j]=='M'){x2=i;y2=j;}
        }getchar();
    }
int head1=0,head2=0,tail1=1,tail2=1;
int flag=0;
    e1[1].x=x1;e1[1].y=y1;e1[1].ans=0;  //初始Y
    e2[1].x=x2;e2[1].y=y2;e2[1].ans=0;
    a1[x1][y1]=1;a2[x2][y2]=1;

while(head1<tail1||head2<tail2){
        head1++;head2++;
        int s1=e1[head1].ans+1;
        int s2=e2[head2].ans+1;
int k=0,kk=0;
        for(int i=0;i<4;i++){
            int fx1=e1[head1].x+dx[i];
            int fy1=e1[head1].y+dy[i];
            if(fx1<=0||fx1>n||fy1<=0||fy1>m||map[fx1][fy1]=='#'){continue;}
            if(a1[fx1][fy1]==0){
                if(map[fx1][fy1]=='@'){
                        a1[fx1][fy1]=s1;
                /*if(a2[fx1][fy1]!=0){
                    printf("%lld\n",11*(a1[fx1][fy1]+a2[fx1][fy1]));
                    flag=1;break;
                }*/}
                else a1[fx1][fy1]=1;
                    tail1++;
            e1[tail1].x=fx1;
            e1[tail1].y=fy1;
            e1[tail1].ans=s1;
           // printf("%d %d %d\n",fx1,fy1,s1);
            }
        }
        if(flag)break;
    for(int i=0;i<4;i++){
            int fx2=e2[head2].x+dx[i];
            int fy2=e2[head2].y+dy[i];
            if(fx2<=0||fx2>n||fy2<=0||fy2>m||map[fx2][fy2]=='#'){continue;}
            if(a2[fx2][fy2]==0){
                if(map[fx2][fy2]=='@'){
                        a2[fx2][fy2]=s2;
                /*if(a1[fx2][fy2]!=0){
                    printf("%lld\n",11*(a1[fx2][fy2]+a2[fx2][fy2]));
                    flag=1;break;
                }*/}
                else a2[fx2][fy2]=1;
                    tail2++;
            e2[tail2].x=fx2;
            e2[tail2].y=fy2;
            e2[tail2].ans=s2;
           // printf("    %d %d %d\n",fx2,fy2,s2);
            }
        }
        if(flag)break;

    }
    long long int max=11111111;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(map[i][j]=='@'){
                if(a1[i][j]+a2[i][j]<max)max=a1[i][j]+a2[i][j];
            }
        }
    }
printf("%lld\n",11*max);
}}

简单搜索&&进阶搜索 - Virtual Judge

思路:一道dfs题,运用在俩层空间中,注意将传送阵的标记改变一下,避免骑士撞死,当搜索到P时判断是否满足时间条件,满足输出YES,不能或不能找到P则输出NO

#include<stdio.h>

struct node
{
    int x;
    int y;
    int z;
    int ans;
}e[200];
int main()
{

    int T;
    scanf("%d",&T);
    while(T--){
    int n,m;
    char a[3][15][15];
    int book[3][15][15]={0};
int dz[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
    int et,i,j,k;
   scanf("%d %d %d",&n,&m,&et);
        getchar();
        for(i=1; i<=2; i++)
        {
            for(j=1; j<=n; j++)
            {
                for(k=1; k<=m; k++)
                    scanf("%c",&a[i][j][k]);
                getchar();
            }
            if(i!=2) getchar();//这个吸收中间那个空白行,注意只有一个空白行。
        }

/*14
5 5 14
S*#*.
.#...
.....
****.
...#.

..*.P
#.*..
***..
...*.
*.#..*/
for (int i=1;i<=n;i++)   //这样处理防止骑士经时空机传输后被撞死,简化了bfs()函数里的判断条件
			for (int j =1;j <=m;j++)
			{
				if (a[1][i][j] == '#' && a[2][i][j]=='#'){
					a[1][i][j] ='*';
					a[2][i][j] = '*';}
				if (a[1][i][j] == '#' && a[2][i][j] =='*')
					{a[1][i][j] = '*';
					a[2][i][j] = '*';}
				if (a[1][i][j] == '*' && a[1][i][j] == '#')
					{a[1][i][j] ='*';
					 a[2][i][j] = '*';
		}	}
    int head=0,tail=1,flag=0;
    e[1].x=1;e[1].y=1;e[1].z=1;e[1].ans=0;
    while(head<tail){
        head++;
        int s=e[head].ans+1;
            for(int i=0;i<4;i++){
            int fx=e[head].x;
            int fy=e[head].y+dy[i];
            int fz=e[head].z+dz[i];
            if(fx<=0||fx>2||fy<=0||fy>n||fz<=0||fz>m){continue;}

            //本层移动
            if(a[fx][fy][fz]=='.'&& book[fx][fy][fz]==0){
                   // printf("%d %d %d %d\n",fx,fy,fz,s);
                book[fx][fy][fz]=1;
                    tail++;
                e[tail].x=fx;
                 e[tail].y=fy;
                 e[tail].z=fz;
                 e[tail].ans=s;
            }
            //跳层
            if(a[fx][fy][fz]=='#'&& book[fx][fy][fz]==0){
            book[fx][fy][fz]=1;
            if(fx==1)fx++;
            else fx--;}
            //判断
            if(a[fx][fy][fz]=='.'&& book[fx][fy][fz]==0){
                book[fx][fy][fz]=1;
           // printf("      %d %d %d %d\n",fx,fy,fz,s);
                tail++;
                e[tail].x=fx;
                 e[tail].y=fy;
                 e[tail].z=fz;
                 e[tail].ans=s;
            }

        if(a[fx][fy][fz]=='P'){flag=1;
       if(s<=et)printf("YES\n");
        else printf("NO\n");
       //printf("%d",s);
       }



    }

if(flag)break;

    }
   // if(flag==0)printf("NO\n");

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值