1390 - 密码锁

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

玛雅人有一种密码,如果字符串中出现连续的2012四个数字就能解开密码。给一个长度为N的字符串,(2=<N<=13)该字符串中只含有0,1,2三种数字,问这个字符串要移位几次才能解开密码,每次只能移动相邻的两个数字。例如02120经过一次移位,可以得到20120,01220,02210,02102,其中20120符合要求,因此输出为1.如果无论移位多少次都解不开密码,输出-1。

题目输入

第一行输入N,第二行输入N个数字,只包含0,1,2

题目输出

输入/输出样例

输入格式

5
02120
5
02120

输出格式

1
1

C语言解答

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

int v[2000000],q[2000000];
int n;
int a[16];

int valid(int a[],int n) {
        int i;
        for(i=0;i+4<=n;i++)
                if (a[i]==2 && a[i+1]==0 && a[i+2]==1 && a[i+3]==2) return 1;
        return 0;
}

int trans1(int a[],int n) {
        int ret=0,i;
        for(i=0;i<n;i++) ret=ret*3+a[i];
        return ret;
}

void trans2(int a[],int n,int m) {
        int i;
        for(i=n-1;i>=0;i--) {
                a[i]=m%3;
                m/=3;
        }
}

int main() {
        char str[16];
        int i,j,t,m,tmp;
        memset(v,0xff,sizeof(v));
        while(scanf("%d",&n)!=EOF) {
                scanf("%s",str);
                for(i=0;i<n;i++) a[i]=str[i]-'0';
                m=trans1(a,n);
                v[m]=t=0,q[t++]=m;
                for(i=0;i<t;i++) {
                        trans2(a,n,q[i]);
                        if (valid(a,n)) break;
                        for(j=0;j<n-1;j++) {
                                tmp=a[j],a[j]=a[j+1],a[j+1]=tmp;
                                m=trans1(a,n);
                                if (v[m]<0) {
                                        v[m]=v[q[i]]+1;
                                        q[t++]=m;
                                }
                                tmp=a[j],a[j]=a[j+1],a[j+1]=tmp;
                        }
                }
                if (i<t) printf("%d\n",v[q[i]]); else puts("-1");
                for(i=0;i<t;i++) v[q[i]]=-1;
        }
        return 0;
}

C++解答

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

int v[2000000],q[2000000];
int n;
int a[16];

int valid(int a[],int n) {
	int i;
	for(i=0;i+4<=n;i++)
		if (a[i]==2 && a[i+1]==0 && a[i+2]==1 && a[i+3]==2) return 1;
	return 0;
}

int trans1(int a[],int n) {
	int ret=0,i;
	for(i=0;i<n;i++) ret=ret*3+a[i];
	return ret;
}

void trans2(int a[],int n,int m) {
	int i;
	for(i=n-1;i>=0;i--) {
		a[i]=m%3;
		m/=3;
	}
}

int main() {
	char str[16];
	int i,j,t,m,tmp;
	memset(v,0xff,sizeof(v));
	while(scanf("%d",&n)!=EOF) {
		scanf("%s",str);
		for(i=0;i<n;i++) a[i]=str[i]-'0';
		m=trans1(a,n);
		v[m]=t=0,q[t++]=m;
		for(i=0;i<t;i++) {
			trans2(a,n,q[i]);
			if (valid(a,n)) break;
			for(j=0;j<n-1;j++) {
				tmp=a[j],a[j]=a[j+1],a[j+1]=tmp;
				m=trans1(a,n);
				if (v[m]<0) {
					v[m]=v[q[i]]+1;
					q[t++]=m;
				}
				tmp=a[j],a[j]=a[j+1],a[j+1]=tmp;
			}
		}
		if (i<t) printf("%d\n",v[q[i]]); else puts("-1");
		for(i=0;i<t;i++) v[q[i]]=-1;
	}
	return 0;
}

Java解答

import java.util.*;

public class Main {
    static class Node {
        StringBuilder sb;
        int cnt;

        public Node() {
        }

        public Node(StringBuilder sb, int cnt) {
            this.sb = sb;
            this.cnt = cnt;
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            sc.nextLine();
            System.out.println(bfs(sc.nextLine(), "2012"));
        }
    }

    private static int bfs(String s, String reg) {
        Queue<Node> queue = new LinkedList<>();
        HashSet<String> set = new HashSet<>();
        queue.add(new Node(new StringBuilder(s), 0));
        while (!queue.isEmpty()) {
            Node node = queue.poll();
            StringBuilder tem = node.sb;
            if (tem.toString().contains(reg)) return node.cnt;
            for (int i = 0; i < tem.length() - 1; i++) {
                StringBuilder next = new StringBuilder(tem.toString());
                swap(next, i, i + 1);
                if (set.contains(next.toString())) continue;
                else set.add(next.toString());
                if (next.toString().contains(reg)) return node.cnt + 1;
                queue.add(new Node(next, node.cnt + 1));
            }
        }
        return -1;
    }

    private static void swap(StringBuilder sb, int i, int j) {
        char temp = sb.charAt(i);
        sb.setCharAt(i, sb.charAt(j));
        sb.setCharAt(j, temp);
    }

}