hdu 5641 King's Phone

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

題目類型:水題測試

題目思路:將點x到點y所須要跨過的點存入mark[x][y]中(無需跨過其它點存0),而後按照題目給的路徑逐一判斷是否可走,得出結果。spa

須要判斷的:code

1.給出的點是否在1~9之間blog

2.點的數量n是否在4~9之間get

3.有沒有重複的點string

4.兩點之間(x-->y)是否須要跨過第三點(z),該點(z)是否已經走過it

測試樣例(基本考慮了全部狀況):io

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

 

實現代碼:class

 

 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 }
相關文章
相關標籤/搜索