迷宫(BFS)

题目链接:https://nanti.jisuanke.com/t/43124
很SB的一个题目。不知道错在了哪儿。。
代码是参考网上的一个代码:

#include<bits/stdc++.h>
 using namespace std;
 #define ll long long
 #define N 1010
 #define inf 0x3f3f3f3f
 char g[N][1010];//地图
 int com[N][N] = { 0 };//用来标记是否为传送门
 int door[N][3] = { 0 };//用来记录传送到哪door[i][0]和door[i][1]分别用来x,y
 int vis[N][N];//当到这一点时所用的花费
 int dir[2][4] = { -1,+1,0,0,0,0,-1,+1 };
 int x, y;
 int n, m;
 int ans = inf;
 struct node
 {
     int x, y, num;
 
 };
 int bfs(int p, int q)
 {
     queue<node>que;
     node w;
     w.x = p, w.y = q, w.num = 0;
     vis[p][q] = 0;
     que.push(w);
     while (!que.empty())
     {
         node w;
         w = que.front();
         que.pop();
         int pp = w.x, qq = w.y;
         //cout<<"sjbd  "<<pp<<" "<<qq<<" "<<w.num<<endl;
         if(pp==x&&qq==y)
         {
             return w.num;
         }
         int u = com[pp][qq];
         // cout<<"u="<<u<<endl;
         if (u != 0)
         {
             int ppp = door[u][0];
             int qqq = door[u][1];
             if (g[ppp][qqq] == '.'&&w.num<vis[ppp][qqq])
             {//传送到的点不是障碍且比较这么走的花费小
                 vis[ppp][qqq] = w.num;
                 node e = w;
                 e.x = ppp, e.y = qqq;
                 que.push(e);
             }
         }
         else
         {
             for (int i = 0; i < 4; i++)
             {
                 int xx = w.x+dir[0][i], yy = w.y+dir[1][i];
                 if (vis[xx][yy]>w.num+1&& g[xx][yy] =='.'&&xx >= 1 && xx <= n && yy >= 1 && yy <= m)
                 {
                     // cout << xx << " " << yy << endl;
                     node e=w;
                     e.num += 1;
                     e.x = xx, e.y = yy;
                     vis[xx][yy] = w.num+1;
                     que.push(e);
                 }
             }
         }
 
     }
     return inf;
}
 int main()
 {
     ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
     fill(vis[0],vis[0]+(N*N),inf);
     cin >> n >> m;
     for (int i = 1; i <= n; i++)
     {
         for (int j = 1; j <= m; j++)
             cin >> g[i][j];
     }
     int p;
     cin >> p;
     while (p--)
     {
         int x1, y1, x2, y2;
         cin >> x1 >> y1 >> x2 >> y2;
         com[x1][y1] = p+1;
         //因为P值不会重复,所以可以用来标记是否为传送门的同时可以同时看他所传送到的地方
         door[p+1][0] = x2;
         door[p+1][1] = y2;
     }
     cin >> x >> y;
     ans=bfs(1, 1);
     if(ans!=inf)
         cout<<ans<<endl;
     else
       cout<<"No solution"<<endl;
    return 0;
}

记忆化搜索显示空间超限,不知道为什么。希望路过的大佬帮忙看一哈。。或者有没有dfs做出来的大佬。。

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;

const int maxx=1e3+100;
int vs[maxx][maxx];
int mp[101][3];
char s[maxx][maxx];
int dp[maxx][maxx];
int d[][2]={{0,1},{1,0},{0,-1},{-1,0}};
int n,m,p,X,Y;

inline void init()
{
	memset(dp,inf,sizeof(dp));
	memset(s,'\0',sizeof(s));
}
inline int dfs(int x,int y)
{
	if(x==X&&y==Y) return dp[X][Y]=0;
	if(dp[x][y]!=inf) return dp[x][y];
	if(s[x][y]=='*') return dp[x][y]=inf;
	if(vs[x][y]) 
	{
		int tx=mp[vs[x][y]][0];
		int ty=mp[vs[x][y]][1];
		dp[x][y]=dfs(tx,ty);
		return dp[x][y];
	}
	for(int i=0;i<4;i++)
	{
		int tx=x+d[i][0];
		int ty=y+d[i][1];
		if(tx<0||tx>=n||ty<0||ty>=m||s[tx][ty]=='*') continue;
		dp[x][y]=min(dp[x][y],dfs(tx,ty)+1);
	}
	return dp[x][y];
}
int main()
{
	scanf("%d%d",&n,&m);
	init();
	for(int i=0;i<n;i++) scanf("%s",s[i]);
	scanf("%d",&p);
	int a,b,c,d;
	for(int i=1;i<=p;i++)
	{
		scanf("%d%d%d%d",&a,&b,&c,&d);
		a-=1,b-=1,c-=1,d-=1;
		vs[a][b]=i;
		mp[i][0]=c;
		mp[i][1]=d;
	}
	scanf("%d%d",&X,&Y);
	X-=1,Y-=1;
	dp[X][Y]=0;
	dfs(0,0);
	if(dp[0][0]<inf) cout<<dp[0][0]<<endl;
	else cout<<"No solution"<<endl;
	return 0;
}

努力加油a啊,(o)/~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

starlet_kiss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值