汽车加油行驶问题

#include <iostream>
#include <fstream>
#define INF 999999;
using namespace std;
int main() {
    ifstream ifs("input.txt");
    ofstream ofs("output.txt");
    //N代表网格总数,K代表汽车装满油后能够够在边上行驶的距离,用边数表示,
    //A代表遇到油库点的油费,B代表如果x坐标和y坐标减小时的倒车费,C代表增设油库的钱(需要额外加上A)。
    int N,K,A,B,C;
    ifs>>N>>K>>A>>B>>C;
    int a[N+1][N+1];//N*N的网格,一共有N+1个交点
    for(int i=1; i<=N; ++i)
        for(int j=1; j<=N; ++j)
            ifs>>a[i][j];//0代表么有油库,1代表油库
    //设置动态数组,f[x][y][0]代表从起始点(1,1)到x,y坐标的最少费用
    //f[x][y][1]代表汽车到达(x,y)坐标时,还能继续行驶的边数
    int f[N+1][N+1][3];
    for(int i=1; i<=N; ++i) {
        for(int j=1; j<=N; ++j) {
            f[i][j][0]=INF;    //初始化
            f[i][j][1]=K;
        }
    }

    //左,上,右,下4个方向,其中,右,下两个方向到当前位置需要加上倒车价格B
    int s[4][3]= {{-1,0,0},{0,-1,0},{1,0,B},{0,1,B}};
    //起点值初始化
    f[1][1][0]=0;
    f[1][1][1]=K;
    for(int x=1; x<=N; ++x) {
        for(int y=1; y<=N; ++y) {
            if(x==1&&y==1) 
                continue;
            int minmoney=INF;
            int minstep;//minmoney存储(x,y)上个位置的最小花费
            int tmpmoney,tmpstep;
            for(int i=0; i<=3; ++i) { //遍历上一个位置的4种可能情况,求出4个位置到当前位置的钱
                if((x+s[i][0]<1&&i==0)||(x+s[i][0]>N&&i==2)||(y+s[i][1]<1&&i==1)||(y+s[i][1]>N&&i==3))
                    continue;//(x,y)的上一个位置越界则continue;
                tmpmoney=f[x+s[i][0]][y+s[i][1]][0]+s[i][2];//上一个位置到当前所花费的钱
                tmpstep = f[x+s[i][0]][y+s[i][1]][1]-1;//每走一个,剩下的步数减1
                if(a[x][y]==1) {//(x,y)遇到加油站则加油
                    tmpmoney+=A;//加上油费,
                    tmpstep=K;//可以走的边数设为K
                }
                if(a[x][y]==0 && tmpstep==0 &&(x!=N||y!=N)) {
                    tmpmoney+=A+C;    //没油,且这个地方没有加油站,且没有到终点
                    tmpstep=K;
                }
                if(minmoney>tmpmoney) { //更新到当前值的最小值 (上个位置到当前费用费用最少的)
                    minmoney=tmpmoney;
                    minstep=tmpstep;
                }
            }
            if(f[x][y][0]>minmoney) { //更新f
                f[x][y][0]=minmoney;
                f[x][y][1]=minstep;
            }
        }
    }
    ofs<<f[N][N][0];
    cout<<f[N][N][0];
    return 0;
}

 

/*问题描述:一辆汽车加满油后可行驶nkm ,旅途中有若干个加油站,设计一个有效的算法, * 指出应在哪些加油站停靠加油,使沿途加油次数最少。 *算法设计:对于给定的n和k个加油站位置,计算最少加油次数。 * 数据输入;由文件input.txt给出输入数据。第一行有2个正整数n和k, * 表示汽车加油后可以行驶的nkm,且旅途中有k个加油站, * 接下来的一行中有k+1个整数,表示第k个加油站与k-1个加油站之间的距离, * 第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地, *结果输出:将计算的最少加油次数输出到文件output.txt * 如果无法到达目的地则输出”no solution“. * 输入文件示例: 输出文件示例: * input.txt output.txt * 7 7 4 * 1 2 3 4 5 1 6 6 部分代码: void greedy(int d[],int n,int k) { int num = 0; int i=0; int s=0; for( i = 0;i n) { //当任意的两个加油站之间的距离大于了汽车的最大行驶距离N cout<<"no solution\n"<<endl; return; } } for( i = 0,s = 0;i n) { num++; s = d[i]; cout<<"加油的站点为: "<<i<<endl<<endl; } cout<<"s="<<s<<" "; cout<<"number="<<num<<endl<<endl; } cout<<"最终加油次数为:"<<num<<endl; } /* 运行结果: * 请输入汽车行驶: * 7 * * 加油站的个数: * 7 * * 请输入各个站点之间的距离 * * 第0到1站点的距离为: * 1 * 第1到2站点的距离为: * 2 * 第2到3站点的距离为: * 3 * 第3到4站点的距离为: * 4 * 第4到5站点的距离为: * 5 * 第5到6站点的距离为: * 1 * 第6到7站点的距离为: * 6 * 第7到8站点的距离为: * 6 * s=1 number=0 * * s=3 number=0 * * s=6 number=0 * * 加油的站点为: 3 * * s=4 number=1 * * 加油的站点为: 4 * * s=5 number=2 * * s=6 number=2 * * 加油的站点为: 6 * * s=6 number=3 * * 加油的站点为: 7 * * s=6 number=4 * * 最终加油次数为:4 * 请按任意键继续. . . * *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值