
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 8119 | Accepted: 3661 |
Description
Input
Output
Sample Input
3 6
HFDFFB
AJHGDH
DGAGEH
Sample Output
6
Source
题意:
给出一个大写字母矩阵,一开始位于左上角,可以上下左右移动但不能移动到曾经经过的字母,问最多可以经过几个字母。
思路: 基础DFS,以前做这道题时,总是不理解怎么统计经过字母的个数和怎么让vis返回,现在重新做终于可以自己理解并解决了。
代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int r,s,sum,cnt,dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
bool vis[30]; char map[30][30];
void dfs(int x,int y)
{
if(cnt>sum) sum=cnt;
vis[map[x][y]-'A']=1;
for(int i=0;i<4;i++)
{
int x1=x+dir[i][0];
int y1=y+dir[i][1];
if(x1>=1&&x1<=r&&y1>=1&&y1<=s&&!vis[map[x1][y1]-'A'])
{
cnt++;
dfs(x1,y1);
vis[map[x1][y1]-'A']=0;
cnt--;
}
}
}
int main()
{
while(cin>>r>>s)
{
for(int i=1;i<=r;i++)
{
for(int j=1;j<=s;j++)
cin>>map[i][j];
}
memset(vis,0,sizeof(vis));
sum=1;cnt=1;
dfs(1,1);
cout<<sum<<endl;
}
return 0;
}