微软笔试题,机器人消砖块

我比较傻叉,居然忘了用动态规划做,用了递归,各种边界判断,而且数组稍大一点就栈溢出。递归可以剪支,稍微减少一些递归次数。不管怎么样还是贴上自己的傻叉代码吧

#include<iostream>
using namespace std;

const int M = 10;///列
const int N = 10;///行
int min = N+M;
char A[N][M];
///d=1代表向下走,d=0代表向右走
void f(char A[N][M], int i,int j,int d, int result)
{
	if (i == N-1&&j == M-1)
	{
		if (result < min)
		{
			min = result;
		}
		return;
	}
	if (d == 0)   ///向右走
	{
		if (j + 1 <= M - 1)  ///没走到边界
		{
			if (A[i][j + 1] == ‘b‘)  ///下一步是障碍物
			{
				f(A, i, j + 1, 0, result + 1);  ///清楚障碍物
				if (i + 1 <= N - 1)             ///走下面
				{
					if (A[i + 1][j] == ‘0‘)
					{
						f(A, i + 1, j, 1, result);
					}
					else
					{
						f(A, i + 1, j, 1, result + 1);
					}
				}
			}
			else
			{
				f(A, i, j + 1, 0, result);  ///向右走
				if (i + 1 <= N - 1)         ///向下走
				{
					if (A[i + 1][j] == ‘0‘)
					{
						f(A, i + 1, j, 1, result + 1);
					}
					else
					{
						f(A, i + 1, j, 1, result + 2);
					}
				}
			}
		}
		else   ///已经向右行走到边界
		{
			///此处i+1<=N-1,否则应该在递归出口
			f(A, i + 1, j, 1, result);
		}
	}
	else    ////向下行走
	{
		if (i + 1 <= N - 1)   ///下边依旧有路
		{
			if (A[i + 1][j] == ‘b‘)
			{
				f(A, i + 1, j, 1, result + 1);///向右继续走
				if (j + 1 <= M - 1)
				{
					if (A[i][j + 1] == ‘0‘)
					{
						f(A, i, j + 1, 0, result);
					}
					else
					{
						f(A, i, j + 1, 0, result + 1);
					}
				}
			}
			else
			{
				if (j + 1 <= M - 1)
				{
					if (A[i][j + 1] == ‘0‘)
					{
						f(A, i, j + 1, 0, result + 1);
					}
					else
					{
						f(A, i, j + 1, 0, result + 2);
					}
				}
				f(A, i + 1, j, 1, result);
			}
		}
		else   ///已经向下行走到边界
		{
			 f(A, i, j + 1, 0, result);
		}
	}
}

/*
int main()
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			A[i][j] = ‘0‘;
		}
	}

	A[0][4] = ‘b‘;
	A[0][5] = ‘b‘;
	A[2][5] = ‘b‘;
	A[3][3] = ‘b‘;
	A[3][4] = ‘b‘;
	A[3][5] = ‘b‘;
	A[2][6] = ‘b‘;

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			cout << A[i][j] << " ";
		}
		cout << endl;
	}

	f(A, 0, 0, 0, 0);
	cout << min << endl;
}
*/

  

时间: 2024-10-23 16:42:37

微软笔试题,机器人消砖块的相关文章

白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)

首先来看看原题 微软2010年笔试题 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对.一个排列中逆序的总数就称为这个排列的逆序数.如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定一数组,要求统计出该数组的逆序数对个数. 计算数列的逆序数对个数最简单的方便就最从前向后依次统计每个数字与它后面的数字是否能组成逆序数对.代码如下: #include <stdio.h> int main()

微软笔试题(苏州)

题目是  小明迷路了,求出他的方位,具体的题目没了,所以没有弄过来,希望大家海涵或者提供一下 #include <iostream> #include <utility> #include <fstream> using namespace std; int N; int M; char ** allmap; char ** side; int const side_length = 3; const pair<int,int> error = make_p

微软笔试题,luckstring

解析:这题主要在于字典排序和重复判断,其实只要使用TreeSet这个能排序的SET集合类就可以轻松解决了 1 import java.util.Scanner; 2 import java.util.TreeSet; 3 import java.util.ArrayList; 4 5 public class Main{ 6 7 public static void main(String[] args){ 8 //扫描获取字符串 9 Scanner s = new Scanner(System

一道有趣的微软笔试题

老师d 的物理测验答案在教室里丢失了,今天那个教室上了5 堂课,老师d 上了3 堂,有可能是a.b.c 三个同学盗窃已知:1.a 上了两堂课2.b 上了三堂课3.c 上了四堂课4.a.b.c 每个人都上了老师d 的两堂课5.五堂课中,三个人到堂的组合各不相同6.老师d 的课中有一堂,三个人中到了两个,事后证明不是那两个人偷得问?是谁偷得

笔试题-----字符串消重

输入的一段字符串中(大小写字母是相同的)将重复出现的字符消除: 输入AaBb 输出:ab #include <iostream> #include<string> #include<stdio.h> using namespace std; int main() { int a[100]; memset(a, 0, sizeof(a)); char num[1000]; cin >> num; int j = 0; for (int i = 0; i <

送上今年微软的一道笔试题

这里送上一道微软的笔试题,具体题目如下: Time Limit: 10000msCase Time Limit: 1000msMemory Limit: 256MB Description Consider a string set that each of them consists of {0, 1} only. All strings in the set have the same number of 0s and 1s. Write a program to find and outp

2015微软实习在线笔试题 - Professor Q&#39;s Software

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Professor Q develops a new software. The software consists of N modules which are numbered from 1 to N. The i-th module will be started up by signal Si. If signal Si is generated multiple times, the i-th module

2017CVTE笔试题

下面是凭记忆整理的2017CVTE校招笔试题,基本上全都是我不会或很模糊的题,为了更好突出重点我以问答题的形式来描述题目. 1. 中序遍历是属于层次遍历.广度优先遍历.深度优先遍历中的哪一种? 答:层次遍历是指一层一层的遍历树中的节点,广度优先遍历是指遍历完它所有的兄弟节点后再开始遍历其孩子节点,因此层次遍历也属于广度优先遍历.深度优先遍历就是顺着节点的孩子节点一直往下搜索,直到没有孩子节点时才开始搜索叶子节点,常见的前序遍历.中序遍历.后序遍历就是属于深度优先遍历. 2. 产生死锁的4个条件,

算法练习--微软面试题26-50

26.左旋转字符串(字符串) 题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串abcdef左旋转2位得到字符串cdefab.请实现字符串左旋转的函数.要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1). 27.跳台阶问题(递归)题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级.求总共有多少总跳法,并分析算法的时间复杂度. 这道题最近经常出现,包括MicroStrategy等比较重视算法的公司都曾先后选用过个这道题作为面试题或者笔试