poj 1154 LETTERS

/*
走字母“迷宫”
从左上角第一个字母开始遍历图
遍历过的字母不再遍历
问最多可以遍历多少个字母
DFS应用
不难理解
详见注释
一次AC
*/
#define LOCAL
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<iomanip>
#include<string>
#include<algorithm>
#include<ctime>
#include<stack>
#include<queue>
#include<vector>
#define N 25
using namespace std;
int map[N][N],mark[N][N],visit[30],ans,m,n,dir[4][2]={0,1,0,-1,1,0,-1,0};
//map记录整张图上的字母mark记录访问过的结点visit记录有哪些字母已经遍历过了
bool legal(int x,int y)//判断合法性
{
	if(x>=1&&x<=m&&y>=1&&y<=n)
		return true;
	return false;
}
void DFS(int d,int x,int y)//d代表搜索深度同时也等于已经遍历过的字母个数
{
	int i,sx,sy;
	for(i=0;i<4;i++)//对当前节点[x,y]的四个方向进行探索
	{
		sx=x+dir[i][0];sy=y+dir[i][1];
		if(legal(sx,sy)&&(!visit[map[sx][sy]])&&(!mark[sx][sy]))
		//如果当前方向是合法结点并且没有被走过并且当前节点的字母没有被访问过
		{//访问之
			mark[sx][sy]=1;//标记当前位置已被访问
			visit[map[sx][sy]]=1;//标记当前字母已被访问
			DFS(d+1,sx,sy);//以该节点为当前节点继续探索他的四个方向
			mark[sx][sy]=0;//反标记该节点位置
			visit[map[sx][sy]]=0;//反标记该字母
		}
	}
	if(ans<d)
		ans=d;
}
int main()
{
#ifdef LOCAL
       freopen("input.txt","r",stdin);
       freopen("output.txt","w",stdout);
#endif

	   int i,j;char ch;
	   //得到图
	   while(cin>>m>>n)
	   {
			for(i=1;i<=m;i++)
			{
				for(j=1;j<=n;j++)
				{
					cin>>ch;
					map[i][j]=ch-'A';
				}
			}
			//初始化
			memset(visit,0,sizeof(visit));
			memset(mark,0,sizeof(mark));
			visit[map[1][1]]=1;//标记第一个被访问的位置
			mark[1][1]=1;//标记第一个被访问的字母
			ans=0;
			DFS(1,1,1);//从[1,1]开始访问第一个字母
			cout<<ans<<endl;//输出结果
	   }
		return 0;
}

你可能感兴趣的:(poj 1154 LETTERS)