字母遊戲(搜索)
阿新 • • 發佈:2019-02-10
數據 virtual default name copy 可能 div tin style
提交: 28 解決: 17
[提交] [狀態] [討論版] [命題人:外部導入]
問題 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,intcur) { 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; }
字母遊戲(搜索)