洛谷P1123取數遊戲題解
阿新 • • 發佈:2018-12-22
這是一道簡單的搜尋題,考查的還是比較基礎的東西,其時搜尋有時候並不難寫,主要是要想到怎麼搜。比如這個題,如果想二維四個方向搜則沒有頭緒,反之因為搜尋是用遞迴實現的,所以我們可以使用遞迴的特性,把大問題處理成小問題來解決。
所以我們可以用處理每一行的形式,把這一行的最大值求出來,再接著向下一行搜,中途再加上回溯操作,這道搜尋就做完了。
\(Code\)
#include <iostream> #include <cstdio> #include <algorithm>c #include <cstring> using namespace std; int t, n, m, data[10][10], vis[10][10], maxn, deep; void dfs(int x, int y, int now) { if (x > n) { maxn = max(maxn, now); return; } int nexy = y + 1, nex = x; if (nexy > m) { nexy = 1; nex++; } if (!vis[x][y] && !vis[x + 1][y] && !vis[x + 1][y - 1] && !vis[x + 1][y - 1] && !vis[x + 1][y + 1] && !vis[x][y - 1] && !vis[x - 1][y + 1] && !vis[x][y + 1] && !vis[x - 1][y] && !vis[x - 1][y - 1]) { vis[x][y] = 1; dfs(nex, nexy, now + data[x][y]); vis[x][y] = 0; } dfs(nex, nexy, now); } int main() { // vis[i][j] = 1, vis[i + 1][j + 1] = 1, vis[i + 1][j - 1] = 1, vis[i + 1][j] = 1, vis[i - 1][j - 1] = 1, vis[i - 1][j] = 1, vis[i - 1][j - 1] = 1, vis[i][j + 1] = 1, vis[i][j - 1] = 1; scanf("%d", &t); while (t--) { maxn = 0; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) scanf("%d", &data[i][j]), vis[i][j] = 0; dfs(1, 0, 0); printf("%d\n", maxn); } } /* 1 3 3 1 1 1 1 99 1 1 1 1 */