CSU 1336: Interesting Calculator(BFS啊 湖南省第九届大学生计算机程序设计竞赛)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1336

1336: Interesting Calculator

Description

There is an interesting calculator. It has 3 rows of buttons.

Row 1: button 0, 1, 2, 3, ..., 9. Pressing each button appends that digit to the end of the display.

Row 2: button +0, +1, +2, +3, ..., +9. Pressing each button adds that digit to the display.

Row 3: button *0, *1, *2, *3, ..., *9. Pressing each button multiplies that digit to the display.

Note that it never displays leading zeros, so if the current display is 0, pressing 5 makes it 5 instead of 05. If the current display is 12, you can press button 3, +5, *2 to get 256. Similarly, to change the display from 0 to 1, you can press 1 or +1 (but
not both!).

Each button has a positive cost, your task is to change the display from x to y with minimum cost. If there are multiple ways to do so, the number of presses should be minimized.

Input

There will be at most 30 test cases. The first line of each test case contains two integers x and y(0<=x<=y<=105). Each of the 3 lines contains 10 positive integers (not greater than 105), i.e. the costs of each button.

Output

For each test case, print the minimal cost and the number of presses.

Sample Input

12 2561 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 112 256100 100 100 1 100 100 100 100 100 100100 100 100 100 100 1 100 100 100 100100 100 10 100 100 100 100 100 100 100

Sample Output

Case 1: 2 2Case 2: 12 3

HINT

Source

湖南省第九届大学生计算机程序设计竞赛

题意:

给定两个数字 x 和 y !

通过三种操作

1、直接在当前显示的数字后面添加一位数

2、在当前显示的数字的基础上增加

3、把当前显示的数字变为其n倍

求从x变为y所需要的最少的花费(每一步操作有相应的花费),如果花费相同,选取操作次数最少的!

PS:

此题直接BFS一遍能走到的所有点,更新为最小的花费!有点Floyd的思路参杂其中!

代码如下:

#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 100017;
queue<int >Q;
int step;
int cont[maxn], dis[maxn], vis[maxn];
int v[7][maxn];

void cal(int s, int tt, int cost)
{
	if(dis[tt]==dis[s]+cost && cont[tt]>cont[s]+1)
	{
		cont[tt] = cont[s]+1;
		if(!vis[tt])
		{
			Q.push(tt);
			vis[tt] = 1;
		}
	}
	else if(dis[tt] > dis[s]+cost)
	{
		dis[tt] = dis[s]+cost;
		cont[tt] = cont[s]+1;
		if(!vis[tt])
		{
			Q.push(tt);
			vis[tt] = 1;
		}
	}
}

void BFS(int x, int y)
{
	int i, j;
	for(i = 0; i < maxn; i++)
	{
		vis[i]=0;
		dis[i]=INF;
		cont[i]=INF;
	}
	Q.push(x);
	vis[x] = 1;
	cont[x] = 0;
	dis[x] = 0;
	while(!Q.empty())
	{
		int t = Q.front();
		Q.pop();
		for(i = 0; i < 10; i++)
		{
			if(t*10+i < maxn)//直接在后面增加一位数
				cal(t,t*10+i,v[0][i]);
			if(t+i < maxn)//原值增加
				cal(t,t+i,v[1][i]);
			if(t*i < maxn)//倍数
				cal(t,t*i,v[2][i]);
		}
	}
}

int main()
{
	int cas = 0;
	int x, y;
	while(~scanf("%d%d",&x,&y))
	{
		while(!Q.empty())
		{
			Q.pop();
		}
		for(int i = 0; i < 3; i++)
		{
			for(int j = 0; j < 10; j++)
			{
				scanf("%d",&v[i][j]);
			}
		}
		BFS(x,y);
		printf("Case %d: %d %d\n",++cas,dis[y],cont[y]);
	}
	return 0;
}

/*
12 256
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
12 256
100 100 100 1 100 100 100 100 100 100
100 100 100 100 100 1 100 100 100 100
100 100 10 100 100 100 100 100 100 100
*/
时间: 2024-12-26 18:32:23

CSU 1336: Interesting Calculator(BFS啊 湖南省第九届大学生计算机程序设计竞赛)的相关文章

CSU 1339: 最后一滴血(模拟啊 湖南省第九届大学生计算机程序设计竞赛)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1339 Description 在ACM/ICPC这样的程序设计竞赛中,最早解出一道题称为抢到FB(First Blood,第一滴血).现在ACM/ICPC世界总决赛甚至为每道题的FB设立了特别奖. 也许我们还可以设一个LB(Last Blood,最后一滴血)奖,奖给最后一个解出某题的队伍.注意:你不能先提交程序,得到Yes之后等比赛快结束时把它再交一遍,因为一旦一只队伍解出了某题,它对

CSU 1330: 字符识别?(字符串模拟啊 湖南省第九届大学生计算机程序设计竞赛)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1330 Description 你的任务是写一个程序进行字符识别.别担心,你只需要识别1, 2, 3,如下: .*.  ***  *** .*.  ..*  ..* .*.  ***  *** .*.  *..  ..* .*.  ***  *** Input 输入仅包含一组数据,由6行组成.第一行为字符的个数n(1<=n<=10).以下5行每行包含4n个字符.每个字符恰好占5行3列,

CSU 1334: 好老师(数学啊 湖南省第九届大学生计算机程序设计竞赛)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1334 Description 我想当一个好老师,所以我决定记住所有学生的名字.可是不久以后我就放弃了,因为学生太多了,根本记不住.但是我不能让我的学生发现这一点,否则会很没面子.所以每次要叫学生的名字时,我会引用离他最近的,我认得的学生.比如有10个学生: A ? ? D ? ? ? H ? ? 想叫每个学生时,具体的叫法是: 位置 叫法 1 A 2 right of A (A右边的同

CSU 1337: 搞笑版费马大定理(数学啊 湖南省第九届大学生计算机程序设计竞赛)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1337 Description 费马大定理:当n>2时,不定方程an+bn=cn没有正整数解.比如a3+b3=c3没有正整数解.为了活跃气氛,我们不妨来个搞笑版:把方程改成a3+b3=c3,这样就有解了,比如a=4, b=9, c=79时43+93=793. 输入两个整数x, y, 求满足x<=a,b,c<=y的整数解的个数. Input 输入最多包含10组数据.每组数据包含两个

湖南省第九届大学生计算机程序设计竞赛 搞笑版费马大定理

搞笑版费马大定理 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 190  Solved: 93 [Submit][Status][Web Board] Description 费马大定理:当n>2时,不定方程an+bn=cn没有正整数解.比方a3+b3=c3没有正整数解.为了活跃气氛,我们最好还是来个搞笑版:把方程改成a3+b3=c3.这样就有解了.比方a=4, b=9, c=79时43+93=793. 输入两个整数x, y, 求满足x<=a,

湖南省第九届大学生计算机程序设计竞赛 字符识别?

字符识别? Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 156  Solved: 98 [Submit][Status][Web Board] Description 你的任务是写一个程序进行字符识别.别担心,你只需要识别1, 2, 3,如下: .*.  ***  *** .*.  ..*  ..* .*.  ***  *** .*.  *..  ..* .*.  ***  *** Input 输入仅包含一组数据,由6行组成.第一行为字符的个数

湖南省第九届大学生计算机程序设计竞赛

好老师 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 108  Solved: 52 [Submit][Status][Web Board] Description 我想当一个好老师,所以我决定记住所有学生的名字.可是不久以后我就放弃了,因为学生太多了,根本记不住.但是我不能让我的学生发现这一点,否则会很没面子.所以每次要叫学生的名字时,我会引用离他最近的,我认得的学生.比如有10个学生: A ? ? D ? ? ? H ? ? 想叫每个学生时,

湖南省第九届大学生计算机程序设计竞赛 高桥和低桥

高桥和低桥 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 358  Solved: 60 Description 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算"淹了两次".举例说明: 假定高桥和低桥的高度分别是5和2,初始水位为1 第一次洪水:水位提高到6(两个桥都被淹),退到2(高桥不再被淹,但低桥仍然

湖南省第九届大学生计算机程序设计竞赛 Interesting Calculator

Interesting Calculator Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 163  Solved: 49 Description There is an interesting calculator. It has 3 rows of buttons. Row 1: button 0, 1, 2, 3, ..., 9. Pressing each button appends that digit to the end of t