[宽度优先搜索BFS]魔兽世界(Standard IO)

题目:[宽度优先搜索BFS]魔兽世界(Standard IO)
题目描述

小A是一个小术士,他很喜欢单挑boss,单挑boss是指在一个n*m的矩形(1<=n,m<=100),上面铺满了小怪和传送门,其中1表示有小怪,0表示没有小怪,大写字母表示传送门,传送门是一对相同的大写字母,如遇到一个大写字母A则马上可以到达另一个大写字母A的位置(次数不限,但每次进入传送点只传送过去,不会再传送回来,数据保证每个传送门有且仅有相对应的另一个传送门).小A的出发点在左上方的(1,1)出发,boss躲在右下方的(n,m).小A决不会再小怪身上浪费时间(当然是绕开它们),并且想用最快的时间到达boss的位置.

输入

第1行两个整数n和m
下面的n行,每行m个字符(入口点和boss点无小怪和传送门),表示地图。地图数据之间无空格。每步只能走一格,方向只能是上,下,左,右。左上角为出发点,右下角为目标点。

输出

如果小A可以找到boss,则输出最少的步数,否则输出“No Solution.”。

样例输入

输入样例1:
3 4
0000
00A0
A000
样例输入2:
4 6
010100
01A100
011101
0000A0

样例输出

输出样例1:
4
样例输出2:
10

Cake 1#
c++

#include<bits/stdc++.h>
using namespace std;
char a[100+10][100+10];
int n,m,w,b[100+10][100+10],fx[5+10][5+10]={{0,1},{1,0},{-1,0},{0,-1}},xa=0,ya=0;
struct node
{
	int x,y,t;
}d[10000+10];
void five(int x,int y)
{
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			if(a[i][j]==a[x][y]&&(i!=x||j!=y))
				xa=i,ya=j;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			cin>>a[i][j];
	d[1]={1,1,0};
	int q=1,p=2;
	while(q<p)
	{
		int x=d[q].x,y=d[q].y,t=d[q].t;
		q++;
		for(int i=0;i<4;++i)
		{
			int xx=x+fx[i][0];
			int yy=y+fx[i][1];
			if(xx<1||yy<1||xx>n||yy>m||a[xx][yy]=='1'||b[xx][yy]==1)
				continue;
			b[xx][yy]=1;
			if(a[xx][yy]!='0')
			{
				five(xx,yy);
				xx=xa,yy=ya;
			}
			d[p++]={xx,yy,t+1};
			if(xx==n&&yy==m)
			{
				cout<<t+1;
				return 0;
			}
		}
	}
	cout<<"No Solution.";
}

Cake 2#
c++

#include<cstdio>
#include<iostream>
using namespace std;
int n,m;
char t;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int ms[110][110];
int v[110][110]; 
int ax[100001];
int ay[100001];
int sum[100001];
bool flag;
int ans;
void bfs()
{
	int head=0;
	int tail=1;
	ax[tail]=1;
	ay[tail]=1;
	sum[tail]=0;
	do
	{
		head++;
		for(int i=0;i<4;i++)
		{
			int nx=ax[head]+dx[i];
			int ny=ay[head]+dy[i];
			if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&ms[nx][ny]==0&&v[nx][ny]==0)
			{
				tail++;
				ax[tail]=nx;
				ay[tail]=ny;
				sum[tail]=sum[head]+1;
//				ms[nx][ny]=-1;
				v[nx][ny]=1;
				if(nx==n&&ny==m)
				{
					printf("%d",sum[tail]);
					flag=true;
					head=tail;
					break;
				}
			}
			if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&ms[nx][ny]>=1&&ms[nx][ny]<=26&&v[nx][ny]==0)
			{
				tail++;
				int nx1,ny1;
				for(int i=1;i<=n;i++)
				{
					for(int j=1;j<=m;j++)
					{
						if(ms[i][j]==ms[nx][ny]&&(nx!=i||ny!=j))
						{
							nx1=i;
							ny1=j;
							break;
						}
					}
				}
				ax[tail]=nx1;
				ay[tail]=ny1;
				sum[tail]=sum[head]+1;
//				ms[nx][ny]=-1;
				v[nx][ny]=1;
//				ms[nx1][ny1]=-1;
				if(nx1==n&&ny1==m)
				{
					printf("%d",sum[tail]);
					flag=true;
					head=tail;
					break;
				}
			}
		} 
	}while(head<tail);
	
}
int main()
{
	scanf("%d%d\n",&n,&m);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>t;
			if(t=='1')
			{
				ms[i][j]=-1;
			}
			if(t=='0')
			{
				ms[i][j]=0;
			}
			if(t>='A'&&t<='Z')
			{
				ms[i][j]=t-64;
			}
		}
		scanf("%c",&t);
	}
	ms[1][1]=-1;
	v[1][1]=1;
//	for(int i=1;i<=n;i++)
//	{
//		for(int j=1;j<=m;j++)
//		{
//			printf("%d ",ms[i][j]);
//		}
//		printf("\n");
//	}
	bfs();
	if(!flag)
	{
		printf("No Solution.");
	}
	return 0;
}

Cake 3#
Pascal

const fx:array[1..4,1..2] of longint=((-1,0),(1,0),(0,-1),(0,1));
var
        b:array['A'..'Z',1..2] of longint;
        c:array[0..100,0..100,1..2] of longint;
        bz:array[0..100,0..100] of longint;
        d:array[0..10000,1..3] of longint;
        ch:char;
        n,m,i,j,st,en,xx,yy,xxx,yyy:longint;
begin
        readln(n,m);fillchar(bz,sizeof(bz),$1f);
        for i:=1 to n do
        begin
                 for j:=1 to m do
                 begin
                        read(ch);
                        if ch in ['A'..'Z'] then
                                if (b[ch,1]=0) and (b[ch,2]=0) then
                                begin
                                        b[ch,1]:=i;
                                        b[ch,2]:=j;
                                end
                                else
                                begin
                                        c[i,j,1]:=b[ch,1];
                                        c[i,j,2]:=b[ch,2];
                                        c[b[ch,1],b[ch,2],1]:=i;
                                        c[b[ch,1],b[ch,2],2]:=j;
                                end;
                        if ch='1' then bz[i,j]:=-1; 
                 end;
                 readln;
        end;
        st:=0;en:=1;d[1,1]:=1;d[1,2]:=1;d[1,3]:=0;
        while st<en do
        begin
                inc(st);
                for i:=1 to 4 do
                begin
                        xx:=d[st,1]+fx[i,1];
                        yy:=d[st,2]+fx[i,2];
                        if (xx>0) and (xx<=n) and (yy>0) and (yy<=m) then
                        begin
                                if (c[xx,yy,1]<>0) and (c[xx,yy,2]<>0) then
                                begin
                                        xxx:=xx;
                                        yyy:=yy;
                                        xx:=c[xxx,yyy,1];
                                        yy:=c[xxx,yyy,2];
                                end;
                                if d[st,3]+1<bz[xx,yy] then
                                begin
                                        inc(en);
                                        d[en,1]:=xx;
                                        d[en,2]:=yy;
                                        d[en,3]:=d[st,3]+1;
                                        bz[xx,yy]:=d[en,3];
                                end;
                                if (xx=n) and (yy=m) then
                                begin
                                        writeln(d[en,3]);
                                        exit;
                                end;
                        end;
                end;
        end;
        writeln('No Solution.');
end.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值