京东笔试消消乐

京东笔试第一题分享:
由于方格比较小,就采用暴力破解的方法,注意一下中间变量的保存就行了,方法比较笨,minNum初始化为格子大小25(最多)
//first problem
void show(int **graph)
{
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            cout << graph[i][j] << "*";
        }
        cout << endl;
    }
    cout << "*********" << endl;
    return;
}

vector<pair<int,int>> cluster(int **graph, int N=5,int M=5)
{
    vector<pair<int,int>> ret;
    // show(graph);
    vector<pair<int,int>> point;
    int x, y;
    pair<int,int> temp;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            if (graph[i][j] != -1)
            {
                temp.first = i;
                temp.second = j;
                int count = 1;
                int index = graph[i][j];
                graph[i][j] = -1;
                point.clear();
                point.push_back(temp);
                int xx = i;
                int yy = j;
                while (point.size() > 0)
                {
                    temp = point.back();
                    point.pop_back();
                    x = temp.first;
                    y = temp.second;
                    if (x > 0 && graph[x - 1][y] == index)
                    {
                        graph[x - 1][y] = -1;
                        count++;
                        point.push_back({x - 1, y});
                    }
                    // cout<<x<<"*"<<graph[4][2]<<endl;
                    if (x < N-1 && graph[x + 1][y] == index)
                    {
                        graph[x + 1][y] = -1;
                        count++;
                        point.push_back({x + 1, y});
                    }
                    if (y > 0 && graph[x][y - 1] == index)
                    {
                        graph[x][y - 1] = -1;
                        count++;
                        point.push_back({x, y - 1});
                    }
                    if (y < M-1 && graph[x][y + 1] == index)
                    {
                        graph[x][y + 1] = -1;
                        count++;
                        point.push_back({x, y + 1});
                    }
                }
                if (count > 2)
                {
                    ret.push_back(temp);
                }
            }
        }
    }
    return ret;
}
void label(int **graph, pair<int,int> position,int N=5,int M=5)
{
    vector<pair<int,int>> point;
    pair<int,int>temp;
    point.push_back(position);
    int index = graph[position.first][position.second];
    int x, y;
    // cout << position[0] << "*" << position[1] << "*" << index << endl;
    while (point.size() > 0)
    {
        temp = point.back();
        point.pop_back();
        x = temp.first;
        y = temp.second;
        graph[x][y] = -1;
        if (x > 0 && graph[x - 1][y] == index)
        {
            graph[x - 1][y] = -1;
            point.push_back({x - 1, y});
        }
        if (x < N-1 && graph[x + 1][y] == index)
        {
            graph[x + 1][y] = -1;
            point.push_back({x + 1, y});
        }
        if (y > 0 && graph[x][y - 1] == index)
        {
            graph[x][y - 1] = -1;
            point.push_back({x, y - 1});
        }
        if (y < M-1 && graph[x][y + 1] == index)
        {
            graph[x][y + 1] = -1;
            point.push_back({x, y + 1});
        }
    }
    return;
}

void fall(int **&graph,int N=5,int M=5)
{
    for (int i = N-2; i >= 0; i--)
    {
        for (int j = 0; j < M; j++)
        {
            if (graph[i][j] != -1 && graph[i + 1][j] == -1)
            {
                int k = i;
                while (k < N-1 && graph[k + 1][j] == -1)
                    k++;
                graph[k][j] = graph[i][j];
                graph[i][j] = -1;
            }
        }
    }
    return;
}
int count(int **graph,int N=5,int M=5)
{
    // show(graph);
    int ret = 0;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            if (graph[i][j] != -1)
                ret++;
        }
    }
    return ret;
}
void entertainment(int **graph, int &minNum, int N=5,int M=5)
{
    // show(graph);
    int **dataArray = (int **)malloc(sizeof(int *)*N);
    for (int i = 0; i < N; i++)
        dataArray[i] = new int[5];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            dataArray[i][j] = graph[i][j];
        }
    }
    vector<pair<int,int>> ret = cluster(dataArray,N,M);
    if (ret.size() == 0)
    {
        int temp = count(graph,N,M);
        if (temp < minNum)
            minNum = temp;
        return;
    }
    for (int i = 0; i < ret.size(); i++)
    {
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++)
            {
                dataArray[i][j] = graph[i][j];
            }
        }
        pair<int,int> position = ret[i];
        // show(dataArray);
        label(dataArray, position,N,M);
        // show(dataArray);
        fall(dataArray,N,M);
        // show(dataArray);
        // cout<<position[0]<<position[1]<<graph[position[0]][position[1]]<<endl;
        entertainment(dataArray, minNum,N,M);
    }
    return;
}
第二题,迷宫求解:
讲输入当成一个格子,复制一个3*3的格子,再用dfs判断有没有路径到边缘即可.
bool findPath(vector<string >& grid, vector<vector<bool > >& vis, int y, int x)
{
	
	if (y == -1 || y == grid.size() || x == -1 || x == grid[0].size())
		return true;

	if (vis[y][x] || grid[y][x] == '#')
		return false;
	vis[y][x] = true;

	if (findPath(grid, vis, y - 1, x) || findPath(grid, vis, y + 1, x) || findPath(grid, vis, y , x - 1) || findPath(grid, vis, y, x+1))
		return true;

	return false;
}


int girdPath()
{
	int t;
	cin >> t;
	for (int k = 0; k < t; k++)
	{
		int m, n;
		cin >> m >> n;

		vector<string > grid(m);
		for (int i = 0; i < m; i++)
			cin >> grid[i];

		// copy 3*3
		vector<string > bigGrid(3 * m);
		for (int i = 0; i < m; i++)
		{
			bigGrid[i] = grid[i] + grid[i] + grid[i];
			bigGrid[m + i] = bigGrid[i];
			bigGrid[2*m + i] = bigGrid[i];
		}
		
		// find start point
		int i, j;
		bool find = false;
		for (i = 0; i < m; i++)
		{
			for (j = 0; j < n; j++)
			{
				if (grid[i][j] == 'S')
				{
					find = true;
					break;
				}
			}
			if (find)
				break;
		}

		// find path
		vector<vector<bool>> vis(3 * m);
		for (int i = 0; i < 3 * m; i++)
			vis[i] = vector<bool >(3 * n, false);
		
		if (findPath(bigGrid, vis, m + i, n + j))
			cout << "Yes" << endl;
		else
			cout << "No" << endl;

	}

	return 0;
}





#京东#
全部评论

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
4
11
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务