模拟 2016.5.29

1、HDU 1998 奇数阶魔方

// 很久以前写的,当时费了好大劲,不过很爽
#include <iostream>
#include <iomanip>
#include <stdio.h>
using namespace std;

int main()
{
    int T;
    int n;
    int number[19][19] = {0};
    int i,j;
    int num = 1;
    int x,y;

    while (scanf("%d",&T) != EOF) {
        j=0;
        while (j < T) {
            j++;
            cin>>n;
            x = 0; y = n/2; num=1; number[x][y]=num;
            for (i=1; i<n*n; i++) {
                num++;
                if (x-1 < 0) {
                    x = n-1; y = y+1;
                    if (n==y) {
                        x = 1; y = n -1;
                    }
                }
                else if (n == y+1) {
                    x = x-1; y = 0;
                    if (x < 0) {
                        x = 1; y = n-1;
                    }
                }
                else if (number[x-1][y+1] != 0) {
                    x = x+1;
                }
                else {
                    x= x-1; y = y+1;
                }
                number[x][y] = num;
            }
            for (x=0; x<n; x++) {
                for (y=0; y<n; y++) {
                    if (y < n-1) {
                        cout<<setw(4)<<number[x][y];
                    }
                    else {
                        cout<<setw(4)<<setiosflags(ios::right)<<number[x][y]<<endl;
                    }
                }
            }
            for (x=0; x<n; x++) {
                for (y=0; y<n; y++) {
                    number[x][y] = 0;
                }
            }
        }
    }
    return 0;
}


2、HDU 5641 King's Phone

题意:
判断设置的密码是否合法,和设置手机解锁图案一样的规则
1、大于等于四个点
2、不能重复
3、如果某两个的中点如果还没有被访问过,那么这两个点不能直接连接

解题思路:
注意si可能为0或大于9

//BC_75_1002,刚开始AC了,然而终测TLE
//HDU挂出来以后再拿这个代码交,竟然 842MS 过了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

int vis[15];
int s[15];

int judge(int n)
{
    if (s[n] == 5) {
        return 0;
    }
    if ((s[n]+s[n+1])==10 && !vis[5]) {
        return 1;
    }
    if (s[n]==1 && s[n+1] == 3 && !vis[2]) {
        return 1;
    }
    if (s[n]==3 && s[n+1] == 1 && !vis[2]) {
        return 1;
    }
    if (s[n]==7 && s[n+1] == 9 && !vis[8]) {
        return 1;
    }
    if (s[n]==9 && s[n+1] == 7 && !vis[8]) {
        return 1;
    }
    if (s[n]==1 && s[n+1] == 7 && !vis[4]) {
        return 1;
    }
    if (s[n]==7 && s[n+1] == 1 && !vis[4]) {
        return 1;
    }
    if (s[n]==9 && s[n+1] == 3 && !vis[6]) {
        return 1;
    }
    if (s[n]==3 && s[n+1] == 9 && !vis[6]) {
        return 1;
    }
    return 0;
}

int main()
{
//    freopen("in.txt", "r", stdin);
    int T;
    cin>>T;
    while (T--) {
        memset(vis, 0, sizeof(vis));
        int k;
        cin>>k;
        int flag = 0;
        for (int i=0; i<k; ++i) {
            cin>>s[i];
            if (s[i] > 9 || s[i] == 0) {
                flag = 1;
            }
        }
        int Count = 0;
        if (flag == 0) {
            for (int i=0; i<k; ++i) {
                if (vis[s[i]]) {
                    flag = 1;
                    break;
                }
                if (i+1 < k) {
                    if (judge(i)) {
                        flag = 1;
                        break;
                    }
                }
                vis[s[i]] = 1;
                ++Count;
            }
        }
        if (Count < 4) {
            flag = 1;
        }
        if (flag) {
            cout<<"invalid"<<endl;
        } else {
            cout<<"valid"<<endl;
        }
    }
    return 0;
}
//156MS,打表大法好
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 9 + 10;
int s[maxn];
bool vis[maxn];
int mid[maxn][maxn];

void Init(void);

int main(void)
{
//    freopen("in.txt", "r", stdin);
    Init();
    int T;
    scanf("%d", &T);
    while (T--) {
        memset(vis, false, sizeof(vis));
        int k;
        scanf("%d", &k);
        for (int i=0; i<k; ++i) {
            scanf("%d", &s[i]);
        }
        bool flag = true;
        int Count = 0;
        for (int i=0; i<k; ++i) {
            if (s[i] == 0 || s[i] > 9) {
                flag = false;
                break;
            }
            if (!vis[s[i]]) {
                ++Count;
                if (i > 0) {
                    int t = mid[s[i-1]][s[i]];
                    if (t != 0 && !vis[t]) {
                        flag = false;
                        break;
                    }
                }
                vis[s[i]] = true;
            } else {
                flag = false;
                break;
            }
        }
        if (flag && Count >= 4) {
            printf("valid\n");
        } else {
            printf("invalid\n");
        }
    }
    return 0;
}

void Init(void)
{
    memset(mid, 0, sizeof(mid));
    mid[1][3] = mid[3][1] = 2;
    mid[4][6] = mid[6][4] = 5;
    mid[7][9] = mid[9][7] = 8;
    mid[1][7] = mid[7][1] = 4;
    mid[2][8] = mid[8][2] = 5;
    mid[3][9] = mid[9][3] = 6;
    mid[1][9] = mid[9][1] = 5;
    mid[3][7] = mid[7][3] = 5;
}

3、UVa 133 The Dole Queue

题意:
为了缩短领救济品的队伍,NNGLRP决定了以下策略:
每天所有来申请救济品的人会被放在一个大圆圈,面朝里面
选定一个人为编号 1 号,其他的就从那个人开始逆时针开始编号直到 N
一个官员一开始逆时针数,数 k 个申请者,然后另一个官员第 N 个始顺时针方向数 m 个申请者,这两个人就被送去再教育
如果两个官员数的是同一个人,那个人则被送去从政
然后2个官员再在剩下的人里面继续选直到没人剩下来

Input
输入含有多组测试数据,每组测试数据一列含有三个数 N,k 和 m(k, m > 0,0 < N < 20)。 当输入为 0 0 0 代表输入结束

Output
对每组测试资料输出一列。输出被选中的申请者的编号顺序(一对一对的)。每个数的宽度为 3
每一对前面的那个编号为逆时针数的官员选出的,后面的那个编号为顺时针数的官员选出的(但是如果这2个官员选出同一个人,那就只会有一个编号)
每一对之间以逗号分开
格式请参考Sample Output

Sample Input
10 4 3
13 17 42
7 8 47
0 0 0

Sample Output
  4  8,  9  5,  3  1,  2  6, 10,  7
  4 11, 10  1,  8  6, 13  7,  3,  5 12,  9  2
  1  3,  5  7,  2  4,  6
 
解题思路:
数据规模比较小,用数组模拟一下

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 1e5;
int N, k, m;
int Queue[maxn];
bool vis[30];

int main()
{
//    freopen("in.txt", "r", stdin);
    while (scanf("%d%d%d", &N, &k, &m) != EOF && !(N == 0 && k == 0 && m == 0)) {
        memset(vis, false, sizeof(vis));
        for (int i=1; i<=N; ++i) {
            Queue[i] = i;
        }
        int Count = 0;
        int a_t = 1, b_t = N;
        while (Count < N) {
            int a = 0, b = 0;
            int i = a_t;
            int k_Count = 0, m_Count = 0;
            while (1) {
                if (!vis[Queue[i]]) {
                    ++k_Count;
                    if (k_Count == k) {
                        a = Queue[i];
                        ++Count;
                        break;
                    }
                }
                ++i;
                if (i > N) {
                    i = 1;
                }
            }
            i = b_t;
            while (1) {
                if (!vis[Queue[i]]) {
                    ++m_Count;
                    if (m_Count == m) {
                        b = Queue[i];
                        ++Count;
                        break;
                    }
                }
                --i;
                if (i == 0) {
                    i = N;
                }
            }
            if (a == b) {
                vis[a] = true;
                --Count;
                printf("%3d", a);
            } else {
                vis[a] = true;
                vis[b] = true;
                printf("%3d%3d", a, b);
            }
            if (Count != N) {
                printf(",");
            }
            a_t = a; b_t = b;
        }
        printf("\n");
    }
    return 0;
}

4、NUC_第11届校赛_F 相对距离
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <queue>

using namespace std;

const int INF = 0x3f3f3f3f;

const int maxn = 1000 + 10;
char s1[maxn];
char s2[maxn];
char t1[1000][maxn];
char t2[1000][maxn];

int main()
{
#ifdef __AiR_H
    freopen("in.txt", "r", stdin);
#endif // __AiR_H
    gets(s1);
    gets(s2);
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int c1 = 0, c2 = 0;
    for (int i = 0; i < len1; ++i) {
        if (s1[i] == '/') {
            int j = 0;
            ++i;
            for (; s1[i] != '/' && i < len1; ++i, ++j) {
                t1[c1][j] = s1[i];
            }
            ++c1;
            if (s1[i] == '/') {
                --i;
            }
        }
    }
    for (int i = 0; i < len2; ++i) {
        if (s2[i] == '/') {
            int j = 0;
            ++i;
            for (; s2[i] != '/' && i < len2; ++i, ++j) {
                t2[c2][j] = s2[i];
            }
            ++c2;
            if (s2[i] == '/') {
                --i;
            }
        }
    }
    int sum = c1 + c2;
    int t = min(c1, c2);
    for (int i = 0; i < t; ++i) {
        if (strcmp(t1[i], t2[i]) != 0) {
            break;
        } else {
            sum -= 2;
        }
    }
    printf("%d\n", sum);
    return 0;
}

5、NUC_第11届校赛_H 填方阵

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <queue>

using namespace std;

const int INF = 0x3f3f3f3f;

char s1[10];
char s2[10];
bool vis[10];

int main()
{
#ifdef __AiR_H
    freopen("in.txt", "r", stdin);
#endif // __AiR_H
    int N;
    scanf("%d", &N);
    int Case = 0;
    while (N--) {
        int c1 = 0;
        bool flag = false;
        memset(vis, false, sizeof(vis));
        for (int i = 1; i <= 9; ++i) {
            cin>>s1[i];
            if (s1[i] == '1') {
                ++c1;
            } else {
                vis[i] = true;
            }
        }
        int t = 0;
        bool flag2 = true;
        for (int i = 1; i <= 9; ++i) {
            cin>>s2[i];
            if (s2[i] == '1') {
                if (!vis[i]) {
                    flag2 = false;
                }
                if (vis[i]) {
                    ++t;
                }
            }
        }
        if (t + c1 >= 9 && flag2) {
            flag = true;
        }
        char s_t[10];

        if (!flag) {
            s_t[1] = s2[7]; s_t[2] = s2[4]; s_t[3] = s2[1];
            s_t[4] = s2[8]; s_t[5] = s2[5]; s_t[6] = s2[2];
            s_t[7] = s2[9]; s_t[8] = s2[6]; s_t[9] = s2[3];
            t = 0;
            flag2 = true;
            for (int i = 1; i <= 9; ++i) {
                if (s_t[i] == '1') {
                    if (!vis[i]) {
                        flag2 = false;
                        break;
                    }
                    if (vis[i]) {
                        ++t;
                    }
                }
            }
        }
        if (t + c1 >= 9 && flag2) {
            flag = true;
        }

        if (!flag) {
            s_t[1] = s2[9]; s_t[2] = s2[8]; s_t[3] = s2[7];
            s_t[4] = s2[6]; s_t[5] = s2[5]; s_t[6] = s2[4];
            s_t[7] = s2[3]; s_t[8] = s2[2]; s_t[9] = s2[1];
            t = 0;
            flag2 = true;
            for (int i = 1; i <= 9; ++i) {
                if (s_t[i] == '1') {
                    if (!vis[i]) {
                        flag2 = false;
                        break;
                    }
                    if (vis[i]) {
                        ++t;
                    }
                }
            }
        }
        if (t + c1 >= 9 && flag2) {
            flag = true;
        }
        if (!flag) {
            s_t[1] = s2[3]; s_t[2] = s2[6]; s_t[3] = s2[9];
            s_t[4] = s2[2]; s_t[5] = s2[5]; s_t[6] = s2[8];
            s_t[7] = s2[1]; s_t[8] = s2[4]; s_t[9] = s2[7];
            t = 0;
            flag2 = true;
            for (int i = 1; i <= 9; ++i) {
                if (s_t[i] == '1') {
                    if (!vis[i]) {
                        flag2 = false;
                        break;
                    }
                    if (vis[i]) {
                        ++t;
                    }
                }
            }
        }
        if (t + c1 >= 9 && flag2) {
            flag = true;
        }
        ++Case;
        printf("case %d: ", Case);
        if (flag) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值