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

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

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

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

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

建图DFS,图要更新。

Source Code:

#include <stdio.h>
#include <string.h>

int node[10], ans[10], n, vis[10], k, fun[1000000][10];
int map[10][10] = {
        {0},
        {0,99,0,2,0,0,0,4,0,5},
        {0,0,99,0,0,0,0,0,5,0},
        {0,2,0,99,0,0,0,5,0,6},
        {0,0,0,0,99,0,5,0,0,0},
        {0,0,0,0,0,99,0,0,0,0},
        {0,0,0,0,5,0,99,0,0,0},
        {0,4,0,5,0,0,0,99,0,8},
        {0,0,5,0,0,0,0,0,99,0},
        {0,5,0,6,0,0,0,8,0,99}
    };
void dfs( int now, int count ){
    int i;
    if( count == n ){
        for( i=0; i<n; i++ )
            fun[k][i] = ans[i];
        k++;
        return ;
    }
    for( i=1; i<10; i++ ){
        if( map[now][i]!=99 && node[i] ){
            if( !map[now][i] && !vis[i] ){
                vis[i] = 1;
                ans[count] = i;
                dfs(i,count+1);
                vis[i] = 0;
            }
            else if( map[now][i] && !vis[i] && vis[map[now][i]] ){
                vis[i] = 1;
                ans[count] = i;
                dfs(i,count+1);
                vis[i] = 0;
            }
        }
    }
}
int main(){
    int  t, temp, i, j;
    scanf("%d",&t);
    while( t-- ){
        k = 0;
        memset(node,0,sizeof(node));
        scanf("%d",&n);
        for( i=0; i<n; i++ ){
            scanf("%d",&temp);
            node[temp] = 1;
        }
        for( i=1; i<10; i++ ){
            if( node[i] ){
                memset(ans,0,sizeof(ans));
                memset(vis,0,sizeof(vis));
                ans[0] = i;
                vis[i] = 1;
                dfs(i,1);
            }
        }
        printf("%d
", k );
        for( i=0; i<k; i++ ){
            for( j=0; j<n-1; j++ )
                printf("%d ",fun[i][j]);
            printf("%d
",fun[i][j]);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wushuaiyi/p/4423213.html