今天校里面比赛,A出来这样一道题。
DFS+HASH+一个判断函数,本题就是如何存入电脑中,并且判断是否能够走到。
/*ACMer:MDK*/#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的复杂吧,归根结底还是思想~
希望自己能够把这份感觉保持下来~!