pku 1198 Solitaire 搜索+剪枝
题意:应该是跳棋游戏(我奶奶经常在家玩。。),一个8*8棋盘,棋子可以在棋盘上前后左右挪一格或者跳一格(如果相邻格子有棋子的话),问初始状态在8步内能否达到给定的终止状态。
下限函数仍然选择不在位置上的棋子个数,然后减枝即可。。
话说POJ卡常数,觉得复杂度应该可以了,就是TLE,然后到TOJ上尝试提交了下,1A,然后只好回来优化常数,把判重换成数组判重,以6S的时间过了。。哎,JAVA就是可怜啊。。
1
import
java.util.
*
;
2 import java.io. * ;
3 public class Main {
4
5 /**
6 * @param args
7 */
8 static point p1[] = new point[ 4 ],p2[] = new point[ 4 ];
9 static boolean map[][] = new boolean [ 10 ][ 10 ];
10 static boolean map1[][] = new boolean [ 10 ][ 10 ];
11 static class point
12 {
13 int r,c;
14 public point( int rr, int cc)
15 {
16 r = rr;
17 c = cc;
18 }
19 public boolean equals(point pos)
20 {
21 return r == pos.r && c == pos.c;
22 }
23 }
24 static final boolean isnotin( int r, int c,point p[])
25 {
26 for ( int i = 0 ;i < 4 ;i ++ )
27 if (p[i].r == r && p[i].c == c)
28 return false ;
29 return true ;
30 }
31 static boolean dfs(point p[], int diff, int layer)
32 {
33 if (layer + diff > 8 ) return false ;
34 else if (diff == 0 )
35 {
36 return true ;
37
38 }
39 else
40 {
41 for ( int i = 0 ;i < 4 ;i ++ )
42 {
43 if (p[i].r + 1 < 8 && isnotin(p[i].r + 1 ,p[i].c,p))
44 {
45 p[i].r ++ ;
46 if (dfs(p,diff + (isnotin(p[i].r - 1 ,p[i].c,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
47 {
48
49 return true ;
50 }
51 p[i].r -- ;
52 }
53 if (p[i].c + 1 < 8 && isnotin(p[i].r,p[i].c + 1 ,p))
54 {
55 p[i].c ++ ;
56 if (dfs(p,diff + (isnotin(p[i].r,p[i].c - 1 ,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
57 {
58
59 return true ;
60 }
61 p[i].c -- ;
62 }
63 if (p[i].c - 1 >= 0 && isnotin(p[i].r,p[i].c - 1 ,p))
64 {
65 p[i].c -- ;
66 if (dfs(p,diff + (isnotin(p[i].r,p[i].c + 1 ,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
67 {
68
69 return true ;
70 }
71 p[i].c ++ ;
72 }
73 if (p[i].r - 1 >= 0 && isnotin(p[i].r - 1 ,p[i].c,p))
74 {
75 p[i].r -- ;
76 if (dfs(p,diff + (isnotin(p[i].r + 1 ,p[i].c,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
77 {
78
79 return true ;
80 }
81 p[i].r ++ ;
82 }
83
84 if (p[i].r + 2 < 8 && isnotin(p[i].r + 2 ,p[i].c,p) &&! isnotin(p[i].r + 1 ,p[i].c,p))
85 {
86 p[i].r += 2 ;
87 if (dfs(p,diff + (isnotin(p[i].r - 2 ,p[i].c,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
88 {
89
90 return true ;
91 }
92 p[i].r -= 2 ;
93
94 }
95 if (p[i].c + 2 < 8 && isnotin(p[i].r,p[i].c + 2 ,p) &&! isnotin(p[i].r,p[i].c + 1 ,p))
96 {
97 p[i].c += 2 ;
98 if (dfs(p,diff + (isnotin(p[i].r,p[i].c - 2 ,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
99 {
100
101 return true ;
102 }
103 p[i].c -= 2 ;
104 }
105 if (p[i].c - 2 >= 0 && isnotin(p[i].r,p[i].c - 2 ,p) &&! isnotin(p[i].r,p[i].c - 1 ,p))
106 {
107 p[i].c -= 2 ;
108 if (dfs(p,diff + (isnotin(p[i].r,p[i].c + 2 ,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
109 {
110
111 return true ;
112 }
113 p[i].c += 2 ;
114 }
115 if (p[i].r - 2 >= 0 && isnotin(p[i].r - 2 ,p[i].c,p) &&! isnotin(p[i].r - 1 ,p[i].c,p))
116 {
117 p[i].r -= 2 ;
118 if (dfs(p,diff + (isnotin(p[i].r + 2 ,p[i].c,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
119 {
120
121 return true ;
122 }
123 p[i].r += 2 ;
124 }
125
126
127 }
128 return false ;
129 }
130 }
131 public static void main(String[] args) throws IOException{
132 Scanner in = new Scanner( new BufferedReader( new InputStreamReader(System.in)));
133 for ( int i = 0 ;i < 4 ;i ++ )
134 p1[i] = new point(in.nextInt() - 1 ,in.nextInt() - 1 );
135 for ( int i = 0 ;i < 4 ;i ++ )
136 p2[i] = new point(in.nextInt() - 1 ,in.nextInt() - 1 );
137 for ( int i = 0 ;i < 8 ;i ++ )
138 {
139 Arrays.fill(map[i], false );
140 Arrays.fill(map1[i], false );
141 }
142 for ( int i = 0 ;i < 4 ;i ++ )
143 {
144 map[p2[i].r][p2[i].c] = true ;
145 map1[p1[i].r][p1[i].c] = true ;
146 }
147 int diff = 0 ;
148 for ( int i = 0 ;i < 4 ;i ++ )
149 {
150 boolean flag = false ;
151 for ( int j = 0 ;j < 4 &&! flag;j ++ )
152 if (p1[i].equals(p2[j]))
153 flag = true ;
154 if ( ! flag) diff ++ ;
155 }
156 if (dfs(p1,diff, 0 )) System.out.println( " YES " );
157 else System.out.println( " NO " );
158
159 }
160
161 }
162
2 import java.io. * ;
3 public class Main {
4
5 /**
6 * @param args
7 */
8 static point p1[] = new point[ 4 ],p2[] = new point[ 4 ];
9 static boolean map[][] = new boolean [ 10 ][ 10 ];
10 static boolean map1[][] = new boolean [ 10 ][ 10 ];
11 static class point
12 {
13 int r,c;
14 public point( int rr, int cc)
15 {
16 r = rr;
17 c = cc;
18 }
19 public boolean equals(point pos)
20 {
21 return r == pos.r && c == pos.c;
22 }
23 }
24 static final boolean isnotin( int r, int c,point p[])
25 {
26 for ( int i = 0 ;i < 4 ;i ++ )
27 if (p[i].r == r && p[i].c == c)
28 return false ;
29 return true ;
30 }
31 static boolean dfs(point p[], int diff, int layer)
32 {
33 if (layer + diff > 8 ) return false ;
34 else if (diff == 0 )
35 {
36 return true ;
37
38 }
39 else
40 {
41 for ( int i = 0 ;i < 4 ;i ++ )
42 {
43 if (p[i].r + 1 < 8 && isnotin(p[i].r + 1 ,p[i].c,p))
44 {
45 p[i].r ++ ;
46 if (dfs(p,diff + (isnotin(p[i].r - 1 ,p[i].c,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
47 {
48
49 return true ;
50 }
51 p[i].r -- ;
52 }
53 if (p[i].c + 1 < 8 && isnotin(p[i].r,p[i].c + 1 ,p))
54 {
55 p[i].c ++ ;
56 if (dfs(p,diff + (isnotin(p[i].r,p[i].c - 1 ,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
57 {
58
59 return true ;
60 }
61 p[i].c -- ;
62 }
63 if (p[i].c - 1 >= 0 && isnotin(p[i].r,p[i].c - 1 ,p))
64 {
65 p[i].c -- ;
66 if (dfs(p,diff + (isnotin(p[i].r,p[i].c + 1 ,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
67 {
68
69 return true ;
70 }
71 p[i].c ++ ;
72 }
73 if (p[i].r - 1 >= 0 && isnotin(p[i].r - 1 ,p[i].c,p))
74 {
75 p[i].r -- ;
76 if (dfs(p,diff + (isnotin(p[i].r + 1 ,p[i].c,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
77 {
78
79 return true ;
80 }
81 p[i].r ++ ;
82 }
83
84 if (p[i].r + 2 < 8 && isnotin(p[i].r + 2 ,p[i].c,p) &&! isnotin(p[i].r + 1 ,p[i].c,p))
85 {
86 p[i].r += 2 ;
87 if (dfs(p,diff + (isnotin(p[i].r - 2 ,p[i].c,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
88 {
89
90 return true ;
91 }
92 p[i].r -= 2 ;
93
94 }
95 if (p[i].c + 2 < 8 && isnotin(p[i].r,p[i].c + 2 ,p) &&! isnotin(p[i].r,p[i].c + 1 ,p))
96 {
97 p[i].c += 2 ;
98 if (dfs(p,diff + (isnotin(p[i].r,p[i].c - 2 ,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
99 {
100
101 return true ;
102 }
103 p[i].c -= 2 ;
104 }
105 if (p[i].c - 2 >= 0 && isnotin(p[i].r,p[i].c - 2 ,p) &&! isnotin(p[i].r,p[i].c - 1 ,p))
106 {
107 p[i].c -= 2 ;
108 if (dfs(p,diff + (isnotin(p[i].r,p[i].c + 2 ,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
109 {
110
111 return true ;
112 }
113 p[i].c += 2 ;
114 }
115 if (p[i].r - 2 >= 0 && isnotin(p[i].r - 2 ,p[i].c,p) &&! isnotin(p[i].r - 1 ,p[i].c,p))
116 {
117 p[i].r -= 2 ;
118 if (dfs(p,diff + (isnotin(p[i].r + 2 ,p[i].c,p2) ? 0 : 1 ) - (map[p[i].r][p[i].c] ? 1 : 0 ),layer + 1 ))
119 {
120
121 return true ;
122 }
123 p[i].r += 2 ;
124 }
125
126
127 }
128 return false ;
129 }
130 }
131 public static void main(String[] args) throws IOException{
132 Scanner in = new Scanner( new BufferedReader( new InputStreamReader(System.in)));
133 for ( int i = 0 ;i < 4 ;i ++ )
134 p1[i] = new point(in.nextInt() - 1 ,in.nextInt() - 1 );
135 for ( int i = 0 ;i < 4 ;i ++ )
136 p2[i] = new point(in.nextInt() - 1 ,in.nextInt() - 1 );
137 for ( int i = 0 ;i < 8 ;i ++ )
138 {
139 Arrays.fill(map[i], false );
140 Arrays.fill(map1[i], false );
141 }
142 for ( int i = 0 ;i < 4 ;i ++ )
143 {
144 map[p2[i].r][p2[i].c] = true ;
145 map1[p1[i].r][p1[i].c] = true ;
146 }
147 int diff = 0 ;
148 for ( int i = 0 ;i < 4 ;i ++ )
149 {
150 boolean flag = false ;
151 for ( int j = 0 ;j < 4 &&! flag;j ++ )
152 if (p1[i].equals(p2[j]))
153 flag = true ;
154 if ( ! flag) diff ++ ;
155 }
156 if (dfs(p1,diff, 0 )) System.out.println( " YES " );
157 else System.out.println( " NO " );
158
159 }
160
161 }
162