1044BFS+DFS

/*
	HDOJ1044 BFS+DFS
	把起点@,终点<,各个分值点A~J 作为目标点,分别对各个点DFS得到各个点对的最近距离
	
	再用BFS,从起点到终点,经过各个分值点在时间限制内所能得到的最优值
	
	遗留问题一:
		说好的用Floyd代替BFS求最优值自己实现不出来。。。。
	遗留问题二:
		为啥  用   dist[0][k+1]>t 作为终止条件就是错的 !!!!求大神指教 
*/

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <cstring>
#include <sstream>
#include <queue>
#include <stack>
using namespace std;

#define input freopen("input.txt","r",stdin)
#define output freopen("output.txt","w",stdout)
#define For1(i,a,b) for (i=a;i<b;i++)
#define For2(i,a,b) for (i=a;i<=b;i++)
#define Dec(i,a,b) for (i=a;i>b;i--)
#define Dec2(i,a,b) for (i=a;i>=b;i--)
#define Sca_d(x) scanf("%d",&x)
#define Sca_s(x) scanf("%s",x)
#define Sca_c(x) scanf("%c",&x)
#define Sca_f(x) scanf("%f",&x)
#define Sca_lf(x) scanf("%lf",&x)
#define Fill(x,a) memset(x,a,sizeof(x))
#define MAXN 0x7fffffff

int n,m,k;
int score[150];
int dist[200][200];
char Map[550][550],in[550];
int dir_x[]={0,1,-1,0,0};
int dir_y[]={0,0,0,1,-1};
int vis[55],sum,ans,t;

void bfs(int tx,int ty,int num)
{
	int head=1,tail=1,dir,nx,ny;
	int steps[55][55],visit[55][55];
	struct
	{
		int x,y;
	}que[2555];
	Fill(steps,0);Fill(visit,0);Fill(que,0);
	que[head].x=tx;
	que[head].y=ty;
	visit[tx][ty]=1;
	while(head<=tail)
	{
		For2(dir,1,4)
		{
			nx=que[head].x+dir_x[dir],ny=que[head].y+dir_y[dir];
			if (nx>=0&&nx<n&&ny>=0&&ny<m&&!visit[nx][ny]&&Map[nx][ny]!='*')
			{
				steps[nx][ny]=steps[que[head].x][que[head].y]+1;
				tail++;
				que[tail].x=nx;
				que[tail].y=ny;
				visit[nx][ny]=1;
				if (Map[nx][ny]>='A'&&Map[nx][ny]<='J')
					dist[num][Map[nx][ny]-'A'+1]=steps[nx][ny];
				else if (Map[nx][ny]=='@')
					dist[num][0]=steps[nx][ny];
				else if (Map[nx][ny]=='<')
					dist[num][k+1]=steps[nx][ny];
			}
		}
		head++;
	}
}

void dfs(int s,int value,int time)
{
	int i;
    if(time>t) return;//超出限制时间
    if(ans==sum) return;//已经得到了最大的价值,剪枝(没有这个会超时)
						//借鉴的kuangbin大神的高级思路! 
    if(s==k+1)
    {
        if(value>ans) ans=value;
        return;
    }
    For2(i,1,k+1)
    {
        if(dist[s][i]==0||vis[i]) continue;
        vis[i]=true;
        dfs(i,value+score[i],time+dist[s][i]);
        vis[i]=false;
    }
}

int main()
{
	//input;
	int i,j,Case;
	cin>>Case;
	for(int Case_num=1;Case_num<=Case;Case_num++)
	{
		getchar();
		Fill(score,0);Fill(dist,0);Fill(score,0);Fill(Map,0);Fill(vis,0);sum=0,ans=-1;
		//一切有用的东西赋初值! 
		cin>>m>>n>>t>>k;
		For2(i,1,k) Sca_d(score[i]),sum+=score[i];//输入分值的和时,顺便计算所有分值的和。方便剪枝 
		For2(i,0,n-1)
		{
			Sca_s(in);
			For2(j,0,m-1)
				Map[i][j]=in[j];
		}
		For2(i,0,n-1)
			For2(j,0,m-1)
				if ((Map[i][j]>='A'&&Map[i][j]<='J')) 
					bfs(i,j,Map[i][j]-'A'+1);//A表示为1,依次类推 
				else if (Map[i][j]=='@')
					bfs(i,j,0);//起点标号为0
		/*For2(i,0,k)
		{
			For2(j,0,k+1)
				printf("%d ",dist[i][j]);
			cout<<endl;
		}
		cout<<endl;*/
		//写DFS为了检验BFS的正确性作的中间过程输出 
		printf("Case %d:\n",Case_num);
		
		dfs(0,0,0);
		if (ans>=0) printf("The best score is %d.\n",ans);
		else printf("Impossible\n");
		
		/*if (dist[0][k+1]>t) printf("Impossible\n");
		//不理解用  dist[0][k+1]   作为判断条件为啥WA!!!! 
		else
		{
			dfs(0,0,0);
			printf("The best score is %d.\n",ans);
		}*/
		if (Case_num<Case) cout<<endl;
	}
	return 0;
}
		//ans=dfs(startx,starty);
			/*For2(i,1,k+1)
				if (dist[0][i]&&dist[0][i]<=t)
					dp[i]=score[i],dp_dis[i]=dist[0][i];
			int kk=0;
			For2(kk,0,k+1)
			For2(i,0,k+1)
				if (dist[kk][i])
					For2(j,0,k+1)
						if (dist[i][j])
							if (dist[kk][i]+dist[i][j]<=t)
							{
								if (dp[i]+dp[j]>=dp[j])
									dp[j]=dp[i]+dp[j],dp_dis[j]=dist[kk][i]+dist[i][j];
								else if (dp[j]==dp[i]+dp[j]&&dp_dis[j]<dist[kk][i]+dist[i][j])
									dp_dis[j]=dist[kk][i]+dist[i][j];
							}*/
		/*For2(i,0,k+1)
		{
			For2(j,0,k+1)
				printf("%d ",dist[i][j]);
			cout<<endl;
		}
		cout<<endl;*/
//这里是自己想实现的Floyd求最优值,总是WA。。。。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值