hdu 5641 King's Phone

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5641

题目类型:水题

题目思路:将点x到点y所需要跨过的点存入mark[x][y]中(无需跨过其它点存0),然后按照题目给的路径逐一判断是否可走,得出结果。

需要判断的:

1.给出的点是否在1~9之间

2.点的数量n是否在4~9之间

3.有没有重复的点

4.两点之间(x-->y)是否需要跨过第三点(z),该点(z)是否已经走过

测试样例(基本考虑了所有情况):

10
4 1 3 6 2
4 6 2 1 3
4 8 1 6 7
6 2 1 2 3 5 7
6 1 5 8 2 6 7
5 4 2 8 5 6
5 12 3 4 5 6
7 0 1 2 3 4 5 6
3 1 5 9
9 1 5 9 4 2 6 3 7 8

1.invalid
2.valid
3.valid
4.invalid
5.valid
6.invalid
7.invalid
8.invalid
9.invalid
10.valid

 

实现代码:

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 
 5 //若从i->j 必须经过其它点,存入mark[i][j]中,否则mark[i][j]为0
 6 int mark[10][10] = {
 7         { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 8         { 0, 0, 0, 2, 0, 0, 0, 4, 0, 5 },
 9         { 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 },
10         { 0, 2, 0, 0, 0, 0, 0, 5, 0, 6 },
11         { 0, 0, 0, 0, 0, 0, 5, 0, 0, 0 },
12         { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
13         { 0, 0, 0, 0, 5, 0, 0, 0, 0, 0 },
14         { 0, 4, 0, 5, 0, 0, 0, 0, 0, 8 },
15         { 0, 0, 5, 0, 0, 0, 0, 0, 0, 0 },
16         { 0, 5, 0, 6, 0, 0, 0, 8, 0, 0 }
17 };
18 
19 //a[]存走的路线
20 int a[10];
21 
22 //num[]统计各个点出现的次数
23 int num[10];
24 
25 //flag[]记录各个点是否被走过,0表示未走,1表示已走
26 int flag[10];
27 
28 int main()
29 {
30     int T;
31     int n;
32     int i, ans;
33     scanf("%d", &T);
34     while (T--)
35     {
36         scanf("%d", &n);
37         ans = 1;
38         memset(a, 0, sizeof(a));
39         memset(num, 0, sizeof(num));
40         memset(flag, 0, sizeof(flag));
41         for (i = 1; i <= n; i++)
42         {
43             scanf("%d", &a[i]);
44             if(a[i]<1 || a[i]>9)  //点是否在范围内
45                 ans = 0;
46         }
47         if(!ans)
48         {
49             printf("invalid\n");
50             continue;
51         }
52         for(i=1; i<=n; i++)
53             num[a[i]]++;
54         for (i = 1; i <= 9; i++) {
55             if (num[i] > 1)
56                 break;
57         }
58         if (n < 4 || n >9 || i<10)  //点的数量是否在范围内,各点是不是最多只有一个
59         {
60             printf("invalid\n");
61             continue;
62         }
63         int x, y;
64         for (i = 1; i < n; i++)  //n个点会有n-1条线
65         {
66             x = a[i];
67             y = a[i + 1];
68             if ( (mark[x][y] != 0) && (flag[mark[x][y]] == 0) )
69             {
70                 ans = 0;  //如果x->y需要跨过点mark[x][y],而mark[x][y]未走过,则不可行
71                 break;
72             }
73             flag[x] = 1;
74         }
75         if (ans)
76             printf("valid\n");
77         else
78             printf("invalid\n");
79     }
80     return 0;
81 }

 

转载于:https://www.cnblogs.com/ruo-yu/p/5332410.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值