1
+ <?php
2
+ /**
3
+ * ----------------------------------------
4
+ * | Created By algorithm-php |
5
+ * | User: 南丞 <[email protected] > |
6
+ * | Date: 2019/10/11 |
7
+ * | Time: 下午2:56 |
8
+ * ----------------------------------------
9
+ * | _____ ______ _ _ |
10
+ * | | __ \| ____(_) | | |
11
+ * | | |__) | |__ _ _ __ __ _| | |
12
+ * | | ___/| __| | | '_ \ / _` | | |
13
+ * | | | | | | | | | | (_| | | |
14
+ * | |_| |_| |_|_| |_|\__,_|_| |
15
+ * ----------------------------------------
16
+ * 说明: 面试遇到一个写一个函数 让输出效果 如风车一样旋转 如下
17
+ * foo(4) 逆时针
18
+ * 16,15,14,13
19
+ * 5, 4, 3, 12
20
+ * 6, 1, 2, 11
21
+ * 7, 8, 9, 10
22
+ * foo(4) 顺顺时针
23
+ * 7, 8, 9, 10
24
+ * 6, 1, 2, 11
25
+ * 5, 4, 3, 12
26
+ * 16,15, 14,13
27
+ *
28
+ */
29
+
30
+ $ num = 4 ;
31
+ $ arr = foo ($ num );
32
+ for ($ i = 0 ; $ i < $ num ; $ i ++) {
33
+ echo implode (', ' , $ arr [$ i ])."<br> " ;
34
+ }
35
+
36
+ /**
37
+ * @param $num
38
+ * @param int $direction 方向 1 为 顺时针旋转 2 为逆时针旋转
39
+ * @return mixed
40
+ */
41
+ function foo ($ num , $ direction = 1 )
42
+ {
43
+ //填充map
44
+ $ data = new stdClass ();
45
+ $ data ->x = 1 ;
46
+ if ($ direction == 1 ) {
47
+ $ data ->y = $ num ;
48
+ } elseif ($ direction == 2 ) {
49
+ $ data ->y = 1 ;
50
+ }
51
+ $ data ->num = $ num ;
52
+ $ data ->len = $ num * $ num ;
53
+ $ data ->tmp_data = [];
54
+ $ data ->rate = 1 ;//方向
55
+ $ data ->struct = create_struct ($ num );
56
+ for ($ i = $ data ->len ; $ i >= 1 ; $ i --) {
57
+ $ data ->i = $ i ;
58
+ $ key = change_key ($ data , $ direction );
59
+ $ data ->tmp_data [$ key ] = $ i ;
60
+ unset($ data ->struct [$ key ]);
61
+ }
62
+
63
+ //根据y坐标分组
64
+ $ data ->struct = create_struct ($ num );
65
+ foreach ($ data ->tmp_data as $ key => $ value ) {
66
+ $ data ->struct [$ key ] = $ value ;
67
+ }
68
+ for ($ i = 1 ; $ i <= $ data ->num ; $ i ++) {
69
+ $ start = ($ i - 1 ) * $ data ->num ;
70
+ $ end = $ data ->num ;
71
+ $ slice = array_slice ($ data ->struct , $ start , $ end );
72
+ $ data ->slice [] = $ slice ;
73
+ }
74
+
75
+ return $ data ->slice ;
76
+ }
77
+
78
+ function create_struct ($ num )
79
+ {
80
+ $ struct = [];
81
+ for ($ i = 1 ; $ i <= $ num ; $ i ++) {
82
+ //嵌套
83
+ for ($ m = 1 ; $ m <= $ num ; $ m ++) {
84
+ $ key = $ m .', ' .$ i ;
85
+ $ struct [$ key ] = '' ;
86
+ }
87
+ }
88
+
89
+ return $ struct ;
90
+ }
91
+
92
+ function change_key ($ data , $ direction )
93
+ {
94
+ $ key = $ data ->x .', ' .$ data ->y ;
95
+ if (isset ($ data ->struct [$ key ])) {
96
+ return $ key ;
97
+ }
98
+ switch ($ data ->rate ) {
99
+ // LEFT 方向
100
+ case 1 :
101
+ $ data ->tmp_x = $ data ->x + 1 ;
102
+ $ key = $ data ->tmp_x .', ' .$ data ->y ;
103
+ if (isset ($ data ->struct [$ key ])) {
104
+ $ data ->x = $ data ->tmp_x ;
105
+
106
+ return $ key ;
107
+ } else {
108
+ if ($ direction = 1 ) {
109
+ $ data ->rate = 4 ;
110
+ } elseif ($ direction = 2 ) {
111
+ $ data ->rate = 2 ;
112
+ }
113
+ }
114
+ break ;
115
+ // DOWN 方向
116
+ case 2 :
117
+ $ data ->tmp_y = $ data ->y + 1 ;
118
+ $ key = $ data ->x .', ' .$ data ->tmp_y ;
119
+ if (isset ($ data ->struct [$ key ])) {
120
+ $ data ->y = $ data ->tmp_y ;
121
+
122
+ return $ key ;
123
+ } else {
124
+ if ($ direction = 1 ) {
125
+ $ data ->rate = 1 ;
126
+ } elseif ($ direction = 2 ) {
127
+ $ data ->rate = 3 ;
128
+ }
129
+ }
130
+ break ;
131
+ // RIGHT 方向
132
+ case 3 :
133
+ $ data ->tmp_x = $ data ->x - 1 ;
134
+ $ key = $ data ->tmp_x .', ' .$ data ->y ;
135
+ if (isset ($ data ->struct [$ key ])) {
136
+ $ data ->x = $ data ->tmp_x ;
137
+
138
+ return $ key ;
139
+ } else {
140
+ if ($ direction = 1 ) {
141
+ $ data ->rate = 2 ;
142
+ } elseif ($ direction = 2 ) {
143
+ $ data ->rate = 4 ;
144
+ }
145
+ }
146
+ break ;
147
+ // UP 方向
148
+ case 4 :
149
+ $ data ->tmp_y = $ data ->y - 1 ;
150
+ $ key = $ data ->x .', ' .$ data ->tmp_y ;
151
+ if (isset ($ data ->struct [$ key ])) {
152
+ $ data ->y = $ data ->tmp_y ;
153
+
154
+ return $ key ;
155
+ } else {
156
+ if ($ direction = 1 ) {
157
+ $ data ->rate = 3 ;
158
+ } elseif ($ direction = 2 ) {
159
+ $ data ->rate = 1 ;
160
+ }
161
+ }
162
+ break ;
163
+ }
164
+
165
+ return change_key ($ data , $ direction );
166
+ }
0 commit comments