【笔试】店铺选址+最短路径

    最经找工作中碰到的笔试题,由于时间紧张,仅简单的给出一种解决方法的代码,供大家参考。关于这个代码的优化,留待以后来解决,仅以此记录临场所想,以表纪念。这里主要针对店铺选址问题和最短路径问题,给出了相关的代码。

 

1. 店铺选址(条件:是的利润最大)问题。

    候选店址的坐标为数组X(X[i]表示第i个店址的坐标),候选店址的期望收入为数组Y(Y[i]为地i个店址的期望收入),可以在店址中任意选多个地址,但是为了避免竞争,任意两个店址之间的距离必须大于等于k。输入包含三行,第一行为正整数k,第二行为数组X,为多个逗号隔开的正实数,第三行为数组Y,为多个逗号隔开的正实数。k的取值范围为[1, 10];X[i]和Y[i]的取值范围为[1, 100]

#include 
#include 
#include 
using namespace std;

#define MAXNUM 1024

//获取输入的数据
int get(int *pArray)
{
    string str;
    cin>>str;
    int len = str.size();
    int num = 0;
    int i = 0;
    int number = 0;
    for(i = 0; i < len; i++)
    {
        number = 0;
        while(str[i] != ',' && i < len)
        {
            number = number*10 + str[i] - '0';
            i++;
        }
        pArray[num++] = number;
        //cout<= i; j--)
        {
            if(pX[j] > pX[j+1])
            {
                int temp = pX[j];
                pX[j] = pX[j+1];
                pX[j+1] = temp;

                temp = pY[j];
                pY[j] = pY[j+1];
                pY[j+1] = temp;

                flag = 1;
            }
        }
    }
}

//求取满足条件的店址,并且计算对应收益
void getTheAddress(int *pX, int *pY, int len, int k)
{
    vector result;
    int nSumMax = -1;

    for(int i = 0; i < len; i++)
    {
        vector index;
        int sum = pY[i];
        index.push_back(i);

        for(int j = i + 1; j < len; j++)
        {
            if(pX[j] - pX[index[index.size()-1]] >= k && pX[j] - pX[i] >= k)
            {
                index.push_back(j);
                sum += pY[j];
            }
        }

        if(sum > nSumMax)
        {
            result = index;
            nSumMax = sum;
        }
    }
    //输出结果
    int m = 0;
    for(m = 0; m < result.size()-1; m++)
        cout<>k;
   int X[MAXNUM];
   int Y[MAXNUM];

   int nLen1 = get(X);
   int nLen2 = get(Y);

   if(nLen1 != nLen2)
     return -1;

   //按照地址顺序从小到大排序
   sortXandY(X, Y, nLen1);

   //寻找是的收益最大的选址
   getTheAddress(X, Y, nLen1, k);

   return 0;
}

输入:

2

1,3,2

4,2,5

输出:

【笔试】店铺选址+最短路径_第1张图片

 

2. 走迷宫,最短路径问题,并打印路径

     迷宫大小为m*n,1表示墙,0表示路;计算从(0,0)走到(m-1,n-1)点的最短路径以及输出路径的最短长度。

#include 
#include 
using namespace std;

void GetPath(int **maze, int **mask, int x, int y, int m, int n, int path, int *pminpath, vector &xvec, vector &yvec,vector &rxvec, vector &ryvec)
{
    if(x == m - 1 && y == n - 1)
    {
        if(path < *pminpath)
        {
            rxvec = xvec;
            ryvec = yvec;
            *pminpath = path;
        }
        return;
    }

    int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
    for(int k = 0; k < 4; k++)
    {
        int tx = x + next[k][0];
        int ty = y + next[k][1];


        if(tx < 0 || tx > m - 1 || ty < 0 || ty > n - 1)
            continue;


        if(maze[tx][ty] == 0 && mask[tx][ty] == 0)
        {
            xvec.push_back(tx);
            yvec.push_back(ty);
            mask[tx][ty] = 1;
            GetPath(maze, mask, tx, ty, m, n, path + 1, pminpath, xvec, yvec, rxvec, ryvec);
            mask[tx][ty] = 0;
            xvec.pop_back();
            yvec.pop_back();
        }
    }
    return;
}

int main()
{
    freopen("data.txt", "r", stdin);

    int m, n;
    int i, j;
    cin>>m>>n;

    int **Maze = new int *[m];
    int **Mask = new int *[m];
    for(i = 0; i < m; i++)
    {
        Maze[i] = new int[n];
        Mask[i] = new int[n];
    }

    for(i = 0; i < m; i++)
    {
        for(j = 0; j < n; j++)
        {
            cin>>Maze[i][j];
            Mask[i][j] = 0;
        }  
    }

    vector Xvec;
    vector Yvec;
    vector RXvec;
    vector RYvec;

    int minPath = 99999999;
    Mask[0][0] = 1;
    Xvec.push_back(0);
    Yvec.push_back(0);
    GetPath(Maze, Mask, 0, 0, m, n, 0, &minPath, Xvec, Yvec, RXvec, RYvec);
    cout<

输入:

5 4
0 0 0 1
0 1 0 0
0 1 1 0
0 1 0 0
0 1 0 0

输出:

【笔试】店铺选址+最短路径_第2张图片

 

你可能感兴趣的:(笔试,算法,c++,C语言)