1. 程式人生 > >字母遊戲(搜索)

字母遊戲(搜索)

數據 virtual default name copy 可能 div tin style

問題 S: 【搜索】字母遊戲

時間限制: 10 Sec 內存限制: 64 MB
提交: 28 解決: 17
[提交] [狀態] [討論版] [命題人:外部導入]

題目描述

一種單人玩的遊戲,規則為:
在一個R行C列的方格上,每個方格中有一個A~Z的字母。遊戲從左上角(第一行,第一列)位置開始,一步一步地向相鄰(上、下、左、右)方格移動。唯一的限制是路徑上的方格中的字母,每種字母只能出現1次。
遊戲的目標是走盡可能長的路徑。請你寫程序算出指定棋盤上,可能走的最長步數。

輸入

第1行兩個整數R和C(1≤R,C≤20);
後面R行每行有C個字母,每行表示棋盤上的一行狀態。

輸出

有且只有一行,你計算出的最長步數。

樣例輸入

5 5
IEFCJ
FHFKC
FFALF
HFGCF
HMCHH

樣例輸出

10
思路:爆搜即可。
#include<bits/stdc++.h>
#include<map>
using namespace std;
char str[30][30];
int ans, d[4][2] = { {1,0},{-1,0},{0,1},{0,-1} },n,m;
int vis[30];
void dfs(int x,int y,int
cur) { if (cur > ans)ans = cur; for (int i = 0; i < 4; i++) { int cx = x + d[i][0], cy = y + d[i][1]; if (cx > n || cy > m || cx < 1 || cy < 1 || vis[str[cx][cy] - A] == 1)continue; vis[str[cx][cy] - A] = 1; dfs(cx, cy, cur + 1); vis[str[cx][cy]
- A] = 0; } return; } int main() { cin >> n >> m; for (int i = 1; i <= n; i++)scanf("%s",str[i] + 1); vis[str[1][1] - A] = 1; dfs(1, 1, 1); cout << ans << endl; }

字母遊戲(搜索)