您的位置:首页 > 其它

poj 1154 dfs

2012-02-01 14:18 246 查看
题意:只能上下左右的移动,问最多能找到多少个不同的字母,相同字母的位置不能移动到。

思路:深搜,其中标记数组的方式是把字母映射到整型数组里。

#include<iostream>
using namespace std;
char map[30][30];
bool vis[27];//字母映射的方式来标记
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int n,m,ans;//矩阵的大小,和输出的个数
void dfs(int step,int i,int j)
{
int x,y;
if(step>ans)
ans=step;
for(int k=0;k<4;k++)
{
x=i+dir[k][0];
y=j+dir[k][1];
//printf("x=%d,y=%d\n",x,y);
if(!vis[map[x][y]-'A']&&x>=0&&x<n&&y>=0&&y<m)
{
//printf("%d %d\n",x,y);
vis[map[x][y]-'A']=1;
dfs(step+1,x,y);
//printf("回溯\n");
//system("pause");
vis[map[x][y]-'A']=0;//回溯的时候不需要去管ans,在判断时候会随之更新
}
}
//printf("返回\n");
}
int main()
{
int i,j,p;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
cin>>map[i];//一用%c输入就会意外出错。。。
ans=0;
vis[map[0][0]-'A']=1;
dfs(1,0,0);
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: