您的位置:首页 > 编程语言

今日头条笔试【编程题 + 分析过程发现数学规律 + 回溯法】

2017-10-17 22:36 435 查看
编程题

题目1:(回溯法)

【题目描述】给定一个矩阵,从某点出发,找到箱子,然后把箱子推到目的地。计算最少使用多少步。无法到达用-1表示。

public class Main {

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.nextLine();
String[] data = str.split(" ");
int n = Integer.valueOf(data[0]);
int m = Integer.valueOf(data[1]);
List<String> strList = new ArrayList(n);
for(int i = 0 ; i < n; i++){
strList.add(in.nextLine());
}
//转化为字符矩阵。
char[][] matrix = getMatrix(strList, n, m);
//发现各自的位置
int startX = -1,startY = -1;
int boxX = -1,boxY = -1;
int targetX = -1,targetY = -1;
for(int i =0;i < n;i++){
for(int j =0;j < m;j++){
if(matrix[i][j]=='S'){
startX = i;
startY = j;
}else if(matrix[i][j]=='0'){
boxX = i;
boxY = j;
}else if(matrix[i][j]=='E'){
targetX = i;
targetY = j;
}
}
}

//出发到找到箱子最小。
int findBox = getMinSteps(matrix,startX, startY, boxX, boxY, n, m);
if(findBox == -1){
System.out.println(-1);
}else{
//从箱子到目的地最小化。
int findTarget = getMinSteps(matrix,boxX, boxY, targetX, targetY, n, m);
if(findTarget == -1){
System.out.println(-1);
}else{
System.out.println(findBox + findTarget +1);
}
}
}

public static char[][] getMatrix(List<String> data,int n ,int m){
char[][] result  = new char
[m];
for(int i = 0; i < n ; i++){
for(int j = 0; j < m ;j ++){
result[i][j] = data.get(i).charAt(j);
}
}
return result;
}

public static int getMinSteps(char[][] matrix,int startX,int startY,int endX,int endY,int n,int m){
if(startX < 0 || startY < 0 || startX >= n || startY >= m || matrix[startX][startY]== '#' || matrix[startX][startY] == 'V'){
return -1;
}
if(startX == endX  && startY == endY){
return 0;
}

int ways[] = new int[4];
char preState = matrix[startX][startY];
matrix[startX][startY] = 'V';//表示已访问
ways[0] = getMinSteps(matrix,startX +1,startY,endX,endY,n, m);
ways[1] = getMinSteps(matrix ,startX -1, startY, endX, endY, n, m);
ways[2] = getMinSteps(matrix,startX, startY+1, endX, endY, n, m);
ways[3] = getMinSteps(matrix,startX, startY-1, endX, endY, n, m);
matrix[startX][startY] = preState;
int result = Integer.MAX_VALUE;
for(int i = 0; i < 4;i++){
if(ways[i] >= 0 && result > ways[i]){
result = ways[i];
}
}
return result == Integer.MAX_VALUE ? -1 : result+1;
}
}


题目2:(发现数字规律)

【题意】有n个房间,i 号 房间里的人取出,然后重新分配,分配规则:让 i 号房间中的人全部出来,接下来按照 i + 1,i + 2, i + 3...进行分配,直到所有的人都分配完毕。n 号 房间的 下一个房间是 1 号房间。现在给出分配完后的每个房间的人以及最后一个人被分配的房间x,求出分配前每个房间的人数。
【技巧】 在纸上运行一个简单的例子,人脑分析,通过这个过程就能够发现一些规律。(最初的状态,能进行区分的状态,可以作为还原终止的场景)

public class Main2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int x = in.nextInt();
int[] people = new int[n + 1];
for (int i = 1; i <= n; i++) {
people[i] = in.nextInt();
}
findOrigin(n, x, people);
}

public static void findOrigin(int n, int x, int[] people) {
int count = 0;
int i = x;
while (true) {
//到达0时说明,该处数据被清空了,用来填补之前的数据。(符合逻辑,题目的规则)
if (people[i] == 0) {
break;
}
people[i]--;
count++;
i = (i - 1 + n) % n == 0 ? n : (i - 1 + n) % n; // 向后退位。
}

people[i] = count;
for (int j = 1; j <= n; j++) {
if (j == 1) {
System.out.print(people[j]);
} else {
System.out.print(" " + people[j]);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: