MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

zoj 2412

Posted on 2011-04-28 21:51  MDeath-Kid  阅读(560)  评论(0编辑  收藏  举报

今天校里面比赛,A出来这样一道题。

DFS+HASH+一个判断函数,本题就是如何存入电脑中,并且判断是否能够走到。

/*ACMer:MDK
2011-04-28 21:35:45Accepted 2412C++0208MDK
*/#include <iostream>
#include
<stdio.h>
#include
<queue>

#include
<string.h>
#include
<math.h>
#define MAXN 305
using namespace std;

typedef
struct Bone
{
bool up,down,left,right;
};
Bone B[
11]={{1,0,1,0},{1,0,0,1},{0,1,1,0},{0,1,0,1},{1,1,0,0},{0,0,1,1},
{1,0,1,1},{1,1,1,0},{0,1,1,1},{1,1,0,1},{1,1,1,1}};//11中情况的数据结构。
Bone mat[
52][52];
int mav[52][52]; //判断是否走到了
int m,n;
int sti,stj; //搜索点
int fun(char a) //hash函数
{
if(a=='A')return 0;
if(a=='B')return 1;
if(a=='C')return 2;
if(a=='D')return 3;
if(a=='E')return 4;
if(a=='F')return 5;
if(a=='G')return 6;
if(a=='H')return 7;
if(a=='I')return 8;
if(a=='J')return 9;
if(a=='K')return 10;
}
bool OK(Bone a,Bone b,char f) //判断是否能够走到
{
if(f=='u')
{
if(a.up==1&&b.down==1)
return 1;
else
return 0;
}
else if(f=='d')
{
if(a.down==1&&b.up==1)
return 1;
else
return 0;
}
else if(f=='l')
{
if(a.left==1&&b.right==1)
return 1;
else
return 0;
}
else if(f=='r')
{
if(a.right==1&&b.left==1)
return 1;
else
return 0;
}
return 0;
}
void DFS(int i,int j) //dfs标准搜索
{
mav[i][j]
=1;
//cout<<i<<"__"<<j<<endl;
if(i+1<m&&OK(mat[i][j],mat[i+1][j],'d')&&mav[i+1][j]==0)
DFS(i
+1,j);
if(j+1<n&&OK(mat[i][j],mat[i][j+1],'r')&&mav[i][j+1]==0)
DFS(i,j
+1);
if(i-1>=0&&OK(mat[i][j],mat[i-1][j],'u')&&mav[i-1][j]==0)
DFS(i
-1,j);
if(j-1>=0&&OK(mat[i][j],mat[i][j-1],'l')&&mav[i][j-1]==0)
DFS(i,j
-1);
}
bool all() //跳出条件
{
for(int i = 0;i<m;i++)
for(int j = 0;j<n;j++)
{
if(mav[i][j]==0)
{
sti
=i;stj=j;
return 0;
}
}
return 1;
}
int main()
{
while(cin>>m>>n)
{
memset(mav,
0,sizeof(mav));
if(m==-1&&n==-1) break;
sti
=0;stj=0;
for(int i = 0;i<m;i++)
for(int j = 0;j<n;j++)
{
char a;
cin
>>a;
mat[i][j]
=B[fun(a)];
}
int i=0;
while(!all())
{
i
++;
DFS(sti,stj);
//cout<<"----"<<endl; //这里两个注释的语句很重要,帮我找到了具体哪错了
}
cout
<<i<<endl;
}
}

只是dfs的复杂吧,归根结底还是思想~

希望自己能够把这份感觉保持下来~!