浙江大学2015年校赛B题 ZOJ 3861 Valid Pattern Lock

时间:2023-03-08 22:14:18

这道题目是队友写的,貌似是用暴力枚举出来。

题意:给出一组数,要求这组数在解锁的界面可能的滑动序列。

思路:按照是否能够直接到达建图,如1可以直接到2,但是1不能直接到3,因为中间必须经过一个2。

要注意的假如2已结访问过,那么1就可以直接到2。

建图DFS,图要更新。

Source Code:

#include <stdio.h>
#include <string.h> int node[], ans[], n, vis[], k, fun[][];
int map[][] = {
{},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,}
};
void dfs( int now, int count ){
int i;
if( count == n ){
for( i=; i<n; i++ )
fun[k][i] = ans[i];
k++;
return ;
}
for( i=; i<; i++ ){
if( map[now][i]!= && node[i] ){
if( !map[now][i] && !vis[i] ){
vis[i] = ;
ans[count] = i;
dfs(i,count+);
vis[i] = ;
}
else if( map[now][i] && !vis[i] && vis[map[now][i]] ){
vis[i] = ;
ans[count] = i;
dfs(i,count+);
vis[i] = ;
}
}
}
}
int main(){
int t, temp, i, j;
scanf("%d",&t);
while( t-- ){
k = ;
memset(node,,sizeof(node));
scanf("%d",&n);
for( i=; i<n; i++ ){
scanf("%d",&temp);
node[temp] = ;
}
for( i=; i<; i++ ){
if( node[i] ){
memset(ans,,sizeof(ans));
memset(vis,,sizeof(vis));
ans[] = i;
vis[i] = ;
dfs(i,);
}
}
printf("%d\n", k );
for( i=; i<k; i++ ){
for( j=; j<n-; j++ )
printf("%d ",fun[i][j]);
printf("%d\n",fun[i][j]);
}
}
return ;
}