hdu1078+FatMouse and Cheese+DFS+记忆化搜索

题目大意:一个老鼠在一个n*n方格型城市中挖了有n*n个洞,每个洞中存放0~100不定的奶酪,而洞的附近可能有猫,老鼠想到的吃他储存的奶酪的方法是从他站立的位置开始,每次跳1~k的方格数,然后去吃该位置的奶酪。聪明的老鼠每次都会跳到存放奶酪的位置比当前位置存放的奶酪多的位置。计算老鼠能吃到的最多奶酪为多少。

解题方法:使用DFS的方法,从开始的位置依次遍历所有的存放奶酪比当前位置多的点。为了防止超时,用一个二维数组存放当前位置能获得的最大奶酪数。若某位置的奶酪的最大数已经获得,则不对该位置进行DFS遍历了,从而节省了时间。

#include <iostream>
#include <stack>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <utility>
#include <ctime>
#include <ctype.h>
#include <map>
#include <string>

using namespace std;

#define N 110

int grid[N][N];
int n, k;
int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
bool visited[N][N];
int aHoleCheese[N][N], maxCheese;

bool validGrid(int row, int column)
{
    return (row>=0 && row<n && column>=0 && column<n);
}

int dfs(int curRow, int curColumn)
{
    if (aHoleCheese[curRow][curColumn])return aHoleCheese[curRow][curColumn];
    int curCheese = 0;
    for (int j = 0; j <= k; ++j){
        for (int i = 0; i < 4; ++i){
            int row = curRow+dir[i][0]*j;
            int column = curColumn+dir[i][1]*j;
            if (validGrid(row, column) && grid[row][column]>grid[curRow][curColumn] && !visited[row][column]){
                visited[row][column] = true;
                curCheese = max(curCheese, dfs(row, column));
                visited[row][column] = false;
            }
        }
    }
    return aHoleCheese[curRow][curColumn] = curCheese+grid[curRow][curColumn];
}

int main()
{
    while (cin >> n >> k){
        if (n == -1 && k == -1)break;
        for (int i = 0; i < n; ++i){
            for (int j = 0; j < n; ++j){
                cin >> grid[i][j];
            }
        }
        memset (aHoleCheese, 0, sizeof(aHoleCheese));
        memset (visited, false, sizeof(visited));
        visited[0][0] = true;
        maxCheese = dfs(0, 0);
        cout << maxCheese << endl;
    }
    return 0;
}



你可能感兴趣的:(DFS,记忆化搜索)