您的位置:首页 > 其它

hihocoder#1054 : 滑动解锁

2015-05-10 20:48 330 查看
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>

using namespace std;

int T,m,a[10],ans;
vector<int> mg[10];
int g[10][10];
bool used[10];
void init()
{
memset(g,0,sizeof(g));
g[1][3]=g[3][1]=2;g[1][7]=g[7][1]=4;
g[1][9]=g[9][1]=5;g[2][8]=g[8][2]=5;
g[3][7]=g[7][3]=5;g[4][6]=g[6][4]=5;
g[7][9]=g[9][7]=8;g[3][9]=g[9][3]=6;
}
void dfs(int s,int matching,int step)
{
used[s]=true;
if(matching>=m &&step>=4)
ans++;
int sz=mg[s].size();
if(sz==1 && !used[mg[s][0]])
{
int u=mg[s][0];
int v=g[s][u];
if(v && used[v] ||v==0)
dfs(mg[s][0],matching+1,step+1);
}
else if(sz==2 && ( (used[mg[s][0]]&&!used[mg[s][1]]) || (!used[mg[s][0]]&&used[mg[s][1]]) )  )
{
if(!used[mg[s][0]])
{
int u=mg[s][0];
int v=g[s][u];
if(v&&used[v] ||v==0)
dfs(mg[s][0],matching+1,step+1);
}

else
{
int u=mg[s][1];
int v=g[s][u];
if(v&&used[v] ||v==0)
dfs(mg[s][1],matching+1,step+1);
}

}
else if(sz==0 ||sz==1)
{
for(int i=1;i<10;i++)
{
if(i==s)
continue;
int u=g[s][i];
if(u && used[u] &&!used[i])
{
dfs(i,matching,step+1);
}
else if(u==0 && !used[i])
{
dfs(i,matching,step+1);
}
}
}
used[s]=false;
}
int main()
{
scanf("%d",&T);
init();
while(T--)
{
scanf("%d",&m);
int u,v;
for(int i=0;i<10;i++)
mg[i].clear();
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
mg[u].push_back(v);
mg[v].push_back(u);
}
memset(used,0,sizeof(used));
ans=0;
for(int i=1;i<10;i++)
{
dfs(i,0,1);
}
printf("%d\n",ans);
}
return 0;
}

此题为谷歌公司出的一道面试题,解题思路也不复杂,最主要的难点在于相连经过的点必须为之前走过的点。

不过此题个人认为谷歌公司出题并不严谨,,如果看到的折线为1-9,那么此题似乎就要相对复杂了,但是显然google没有出此类数据,因为当我删除为此(虽然不一定对)做

特殊处理的那一段代码时,还是AC了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: