比赛现场没有做出来,现在看一下就一个宽搜把!!比较经典的那种。
首先要确定队列是以价值为优先排序,要开一个数组来记录该数据的最小花费价值。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int t[4][15];
int q[100005];
struct node{
int x;
int step;
int pri;
bool operator<(const node &b) const
{
return pri > b.pri || (pri == b.pri && step > b.step) ;
}
};
int n,m;
void bfs()
{
priority_queue<node >pq;
node p;
p.pri=0;
p.x=n;
p.step=0;
q[n]=0;
pq.push(p);
while(!pq.empty())
{
p=pq.top();
pq.pop();
if(p.x==m)
{
printf("%d %d\n",p.pri,p.step);
return;
}
for(int i=0; i<3; i++)
{
for(int j=0; j<=9; j++)
{
node p1;
p1.step=p.step+1;
if(i==0) p1.x=p.x*10+j;
if(i==1) p1.x=p.x+j;
if(i==2) p1.x=p.x*j;
p1.pri=p.pri+t[i][j];
if(p1.x<=m && q[p1.x]>p1.pri)
{
q[p1.x]=p1.pri;
pq.push(p1);
}
}
}
}
}
int main()
{
int text=0;
while(~scanf("%d%d",&n,&m))
{
for(int i=0; i<3; i++)
{
for(int j=0; j<10; j++)
{
scanf("%d",&t[i][j]);
}
}
for(int i=0;i<=100000;i++) q[i]=9999999; //设置初始数
printf("Case %d: ",++text);
bfs();
}
return 0;
}
坚持中......