nyoj 543 遥 控 器(枚举模拟)

遥 控 器

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述

Dr.Kong有一台高级电视机,这台电视机可以接受100个频道(从0到99编号)。电视的配套遥控器有13个按钮:

1   2   3   ↑

4   5   6   ↓

7   8   9

—  0

当按"↑"键时,当前频道编号会增加1(如果当前为99频道,则会切换到0频道)。如果按"↓"键,当前频道编号会减小1(如果当前为0频道,则会切换到99频道)。当要切换到0~9频道时,可以直接在遥控器上按相应的键。当要切换到10~99频道时,可以先按"—"键,然后按2个与频道编号相对应的数字键(即先按与频道编号的十位数字相对应的键,然后按与个位数字相对应的键)。

由于遥控器长时间的使用和某些未知原因,遥控器上的某些键已经坏了,不能再起作用了。现在你的任务是,能否告诉Dr.Kong,如何用最少的按键次数来将频道从编号 X切换到编号 Y
输入
第一行: N表示有N组测试数据. (1<=N<=5)
对每组测试数据有5行,前4行包含遥控器上每个按键的信息。0表示对应的键坏了,1表示对应的键可以使用.第5行包含2个整数,分别是X 和 Y (0 <= X <= 99; 0 <= Y <= 99).
输出
对每组测试数据输出一行,即将频道从编号X切换到编号Y所需要的最小按键次数.如果不可能将频道从编号X 切换到编号Y,则输出-1.
样例输入
2
0 0 1 1 
1 1 1 1
1 1 1
1 1
23 52
1 1 1 0
1 1 1 0
1 0 1
0 1
23 52
样例输出
4
-1

刚开始用搜索做的,样例是搞出来了,提交RuntimeError,也没改出来,这是网上思路:

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define inf 999
int num[10];//保存0-9键是否损坏 
int x,y;
int ad,les;//加,减 
int wap;//交换
int swap_num(int a,int b)
{//快速转换 
	if(a==b) return 0;
	else if(b>=0&&b<=9&&num[b]==1)
	{//目标频道是单位数,一步到位 
		return 1;
	}
	else if(b>=10&&num[b/10]==1&&num[b%10]==1&&wap==1)
	{//目标频道是2位数,且'--'键完好,3步到位 
		return 3;
	}
	else return inf;//不能到达 
}
int add_less(int a,int b)
{
	int ans1=inf;
	int ans2=inf;
	if(ad==1)
	{//向上换台 
		if(a<=b)
		{
			ans1= b-a;
		}
		else
		{
			ans1= 99-a+b+1;
		}
	}
	if(les==1)
	{//向下换台 
		if(a>=b)
		{
			ans2= a-b;
		}
		else
		{
			ans2=99-b+a+1;
		}
	}
	return min(ans1,ans2);//二者取最小 
}
int main()
{
	int k;
	scanf("%d",&k);
	while(k--)
	{
		scanf("%d %d %d %d",&num[1],&num[2],&num[3],&ad);//输入按键的状态
        scanf("%d %d %d %d",&num[4],&num[5],&num[6],&les);
        scanf("%d %d %d",&num[7],&num[8],&num[9]);
        scanf("%d %d",&wap,&num[0]);
        scanf("%d %d",&x,&y);//输入起始频道,终止频道
		int res=inf;
		for(int i=0;i<=99;i++)
		{//枚举0-99,以i为中间桥梁,转换到目标频道 
			res=min(res,swap_num(x,i)+add_less(i,y));
		}
		if(res==inf) printf("-1\n");
		else printf("%d\n",res);
	}
	return 0;
}


猜你喜欢

转载自blog.csdn.net/bbhhtt/article/details/80387763