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