码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-04-09 23:23:36      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

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

#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;
}
*/

  

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

标签:

原文地址:http://www.cnblogs.com/jinweiseu/p/5372963.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!