【HDOJ】1983 Kaitou Kid - The Phantom Thief (2)

不仅仅是DFS,还需要考虑可以走到终点。同时,需要进行预处理。至多封闭点数为起点和终点的非墙壁点的最小值。


  1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cstdlib>
5 #include <queue>
6 using namespace std;
7
8 typedef struct node_st {
9 int x, y, t, flg;
10 node_st() {}
11 node_st(int xx, int yy, int tt, int fflg) {
12 x=xx; y=yy; t=tt; flg=fflg;
13 }
14 } node_st;
15
16 char map[10][10];
17 char visit[10][10][2];
18 int direct[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
19 int n, m, time, fmin;
20 int begx, begy, endx, endy;
21
22 bool check(int x, int y) {
23 if (x<0 || x>=n || y<0 || y>= m)
24 return false;
25 return true;
26 }
27
28 bool bfs() {
29 queue<node_st> que;
30 int x, y, t, flg;
31 int i;
32 node_st node;
33
34 memset(visit, 0, sizeof(visit));
35 que.push(node_st(begx, begy, 0, 0));
36 visit[begx][begy][0] = 1;
37
38 while ( !que.empty() ) {
39 node = que.front();
40 que.pop();
41 t = node.t;
42 if (t == time)
43 break;
44 for (i=0; i<4; ++i) {
45 x = node.x + direct[i][0];
46 y = node.y + direct[i][1];
47 flg = node.flg;
48 if ( !check(x, y) )
49 continue;
50 if (map[x][y] != ‘#‘) {
51 if (map[x][y] == ‘E‘ && flg==1)
52 return true;
53 if (map[x][y] == ‘J‘)
54 flg = 1;
55 if (t<time && !visit[x][y][flg]) {
56 visit[x][y][flg] = 1;
57 que.push(node_st(x, y, t+1, flg));
58 }
59 }
60 }
61 }
62
63 return false;
64 }
65
66 void printmap() {
67 for (int i=0; i<n; ++i)
68 printf("\t%s\n", map[i]);
69 }
70
71 int dfs(int t, int cur) {
72 int flg = 0;
73 char ch;
74
75 if (t >= fmin)
76 return 0;
77
78 for (int i=0; i<n; ++i) {
79 for (int j=0; j<m; ++j) {
80 if (map[i][j]==‘.‘ || map[i][j] == ‘J‘) {
81 ch = map[i][j];
82 map[i][j] = ‘#‘;
83 if (cur == t) {
84 //printmap();
85 if ( !bfs() ) {
86 fmin = (t<fmin) ? t:fmin;
87 return 1;
88 }
89 }
90 if (cur < t)
91 flg = dfs(t, cur+1);
92 map[i][j] = ch;
93 }
94 if (flg)
95 return 1;
96 }
97 }
98
99 return 0;
100 }
101
102 int pre() {
103 int i, x, y, tmp1, tmp2;
104
105 tmp1 = 0;
106 for (i=0; i<4; ++i) {
107 x = begx + direct[i][0];
108 y = begy + direct[i][1];
109 if ( check(x, y) && (map[x][y]==‘.‘||map[x][y]==‘J‘))
110 tmp1++;
111 }
112
113 tmp2 = 0;
114 for (i=0; i<4; ++i) {
115 x = endx + direct[i][0];
116 y = endy + direct[i][1];
117 if ( check(x, y) && (map[x][y]==‘.‘||map[x][y]==‘J‘))
118 tmp2++;
119 }
120
121 return tmp1<tmp2 ? tmp1 : tmp2;
122 }
123
124 int main() {
125 int case_n;
126 int i, j;
127
128 scanf("%d", &case_n);
129
130 while (case_n--) {
131 scanf("%d %d %d%*c", &n, &m, &time);
132 for (i=0; i<n; ++i) {
133 scanf("%s", map[i]);
134 for (j=0; j<m; ++j) {
135 if (map[i][j] == ‘S‘) {
136 begx = i;
137 begy = j;
138 }
139 if (map[i][j] == ‘E‘) {
140 endx = i;
141 endy = j;
142 }
143 }
144 }
145 if ( !bfs() ) {
146 printf("0\n");
147 continue;
148 }
149 fmin = pre();
150 //printf("pre:%d\n", fmin);
151 dfs(1,1);
152 //printf("1:%d\n", fmin);
153 dfs(2,1);
154 //printf("2:%d\n", fmin);
155 dfs(3,1);
156 printf("%d\n", fmin);
157 }
158
159 return 0;
160 }

【HDOJ】1983 Kaitou Kid - The Phantom Thief (2)

时间: 2024-10-10 07:16:48

【HDOJ】1983 Kaitou Kid - The Phantom Thief (2)的相关文章

HDU 1983 Kaitou Kid - The Phantom Thief (2) bfs and dfs

Description 破解字迷之后,你得知Kid将会在展览开始后T分钟内盗取至少一颗宝石,并离开展馆.整个展馆呈矩形分布,划分为N*M个区域,有唯一的入口和出口(不能从出口进入,同样不能从入口出去).由某个区域可直接移动至相邻四个区域中的一个,且最快需要一分钟.假设Kid进入放有宝石的区域即可盗取宝石,无需耗时.问至少要封锁几个区域(可以封锁放有宝石的区域,但不能封锁入口和出口)才能保证Kid无法完成任务. Input 输入的第一行有一个整数C,代表有C组测试数据.每组测试数据的第一行有三个整

hdu 1983 Kaitou Kid - The Phantom Thief (2)

bfs+dfs很有意思也很好的一道题 然而我用了很久才ac #include<iostream> #include<cstring> #include<queue> using namespace std; char mapp[10][10]; int visit[10][10]; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int n,m,o; int sx,sy,ex,ey; int flag; struct stu { i

【HDOJ】4956 Poor Hanamichi

基本数学题一道,看错位数,当成大数减做了,而且还把方向看反了.所求为最接近l的值. 1 #include <cstdio> 2 3 int f(__int64 x) { 4 int i, sum; 5 6 i = sum = 0; 7 while (x) { 8 if (i & 1) 9 sum -= x%10; 10 else 11 sum += x%10; 12 ++i; 13 x/=10; 14 } 15 return sum; 16 } 17 18 int main() { 1

【HDOJ】1099 Lottery

题意超难懂,实则一道概率论的题目.求P(n).P(n) = n*(1+1/2+1/3+1/4+...+1/n).结果如果可以除尽则表示为整数,否则表示为假分数. 1 #include <cstdio> 2 #include <cstring> 3 4 #define MAXN 25 5 6 __int64 buf[MAXN]; 7 8 __int64 gcd(__int64 a, __int64 b) { 9 if (b == 0) return a; 10 else return

【HDOJ】2844 Coins

完全背包. 1 #include <stdio.h> 2 #include <string.h> 3 4 int a[105], c[105]; 5 int n, m; 6 int dp[100005]; 7 8 int mymax(int a, int b) { 9 return a>b ? a:b; 10 } 11 12 void CompletePack(int c) { 13 int i; 14 15 for (i=c; i<=m; ++i) 16 dp[i]

【HDOJ】3509 Buge&#39;s Fibonacci Number Problem

快速矩阵幂,系数矩阵由多个二项分布组成.第1列是(0,(a+b)^k)第2列是(0,(a+b)^(k-1),0)第3列是(0,(a+b)^(k-2),0,0)以此类推. 1 /* 3509 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #incl

【HDOJ】1818 It&#39;s not a Bug, It&#39;s a Feature!

状态压缩+优先级bfs. 1 /* 1818 */ 2 #include <iostream> 3 #include <queue> 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 #include <algorithm> 8 using namespace std; 9 10 #define MAXM 105 11 12 typedef struct {

【HDOJ】2424 Gary&#39;s Calculator

大数乘法加法,直接java A了. 1 import java.util.Scanner; 2 import java.math.BigInteger; 3 4 public class Main { 5 public static void main(String[] args) { 6 Scanner cin = new Scanner(System.in); 7 int n; 8 int i, j, k, tmp; 9 int top; 10 boolean flag; 11 int t

【HDOJ】2425 Hiking Trip

优先级队列+BFS. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define MAXN 25 8 9 typedef struct node_st { 10 int x, y, t; 11 node_st() {} 12 node_st(int xx, int yy, int tt)