测试数据出错,找不到问题

某网站规定注册账号时密码必须达到一定强度才可以。他们规定密码长度至少6位,数字、大写字母、小写字母、符号(~!@#$%^&*()[]}{|<>?/.,:”‘;)这四类中至少包含三类才合格。现在请你写一段程序来判断一个密码是否合格。
输入:
第一行为一个整数n(0<n<10),代表测试用例组数,
后边是n行测试用例,每行为一个长度不超过30的字符串
输出:
共n行,与输入的n行测试用例相对应,如果密码合格则输出yes,否则输出no。

#include<stdio.h>
#include<string.h>
int main()
{
    int n;
    int flag1=0,flag2=0,flag3=0,flag4=0;
    scanf("%d",&n);
    int i,j;
    char a[10][50];
    for(i=-1;i<n;i++)
    {
        gets(a[i]);
    }
    for(i=0;i<n;i++)
    {
        if(strlen(a[i])<6)
        {
            printf("no\n");
            continue;
        }
        for(j=0;j<strlen(a[i]);j++)
        {
            if(a[i][j]>='0'&&a[i][j]<='9')flag1=1;
            if(a[i][j]>='a'&&a[i][j]<='z')flag2=1;
            if(a[i][j]>='A'&&a[i][j]<='Z')flag3=1;
            if(a[i][j]>=123&&a[i][j]<=126)flag4=1;
            if(a[i][j]>=91&&a[i][j]<=94)flag4=1;
            if(a[i][j]>=58&&a[i][j]<=60)flag4=1;
            if(a[i][j]>=62&&a[i][j]<=64)flag4=1;
            if(a[i][j]==46||a[i][j]==44||a[i][j]==47)flag4=1;
            if(a[i][j]>=33&&a[i][j]<=42)flag4=1;
        }
        if((flag1+flag2+flag3+flag4)>2)
        {
            printf("yes\n");
            continue;
        }
        else
        {
            printf("no\n");
            continue;
        }
    }
    return 0;
    //printf("%d %d",strlen(a[0]),strlen(a[1]));
}

希望能指出漏洞

http://bbs.bccn.net/thread-498313-1-1.html