1 /*--------------------------模版----------------------*/
2 void BFS(int s)
3 {
4 queue<int> q;
5 q.push(s);
6 while(!q.empty())
7 {
8 //取出队首元素top
9 //访问队首元素top
10 //将队首元素出列
11 //将top的下一层结点中未曾入队的结点全部入队,并设置为已入队
12 }
13 }
14
15 /*--------------------------访问-----------------------*/
16 struct node
17 {
18 int data;
19 }a[10];
20
21 int main()
22 {
23 queue<int> q, p;
24 for(int i=1; i<=3; i++)
25 {
26 a[i].data = i; //a[1]=1,a[2]=2,a[3]=3
27 q.push(i); //这里将数组的下标入队,而非数组,可以避免传递形参,而无法修改实参的情况
28 p.push(a[i]);
29 }
30 p.front().data = 100; //形参无法修改实参
31 printf("%d\n", a[1].data); //output:1
32 a[1] = 50; //实参也无法修改形参
33 printf("%d\n", p.front().data); //output:1
34
35 a[q.front()].data = 100; //通过传递下标,可以修改实参的值
36 printf("%d\n", a[1].data); //output:100
37 return 0;
38 }
39 /*-------------------------矩阵问题--------------------*/
40 /*
41 Descriptation:
42 给出一个m*n的矩阵,矩阵中的元素为0或1。称位置(x,y)与其上下左右四个位置是相邻的。
43 如果矩阵中有若干个1是相邻的(不必两两相邻),那么称这些1构成了一个“块”。求给定的矩阵
44 中“块”的个数。
45
46 Sample Input:
47 0 1 1 1 0 0 1
48 0 0 1 0 0 0 0
49 0 0 0 0 1 0 0
50 0 0 0 1 1 1 0
51 1 1 1 0 1 0 0
52 1 1 1 1 0 0 0
53
54 Sample output:
55 4
56 */
57
58 #include <cstdio>
59 #include <queue>
60 using namespace std;
61 const int MAX_SIZE = 110;
62 struct node
63 {
64 int x, y;
65 int data;
66 bool status; //status表示是否入队,而非是否已访问,否则会重复访问
67 }matrix[MAX_SIZE][MAX_SIZE];
68
69 //X[],Y[]存放四个操作方向
70 int n, m, X[4]={0,0,1,-1}, Y[4]={1,-1,0,0};
71 queue<node> q;
72
73 void Init()
74 {
75 for(int i=0; i<n; i++)
76 for(int j=0; j<m; j++)
77 {
78 scanf("%d", &matrix[i][j].data);
79 matrix[i][j].status = true;
80 matrix[i][j].x = i;
81 matrix[i][j].y = j;
82 }
83 }
84
85 void BFS(node x)
86 {
87 q.push(x);
88 while(!q.empty())
89 {
90 node s = q.front();
91 q.pop();
92 matrix[s.x][s.y].status = false; //这里不能修改s,需要修改matrix内的元素
93 if(s.data)
94 {
95 for(int i=0; i<4; i++)
96 {
97 int nowX = s.x + X[i];
98 int nowY = s.y + Y[i];
99 if(nowX<0 || nowX>=n || nowY<0 || nowY>=m)
100 continue;
101 if(matrix[nowX][nowY].data && matrix[nowX][nowY].status)
102 q.push(matrix[nowX][nowY]);
103 }
104 }
105 }
106 }
107
108 int main()
109 {
110 #ifdef ONLINE_JUDGE
111 #else
112 freopen("Test.txt", "r", stdin);
113 #endif // ONLINE_JUDGE
114
115 scanf("%d%d", &n, &m);
116 Init();
117 int cnt = 0;
118 for(int i=0; i<n; i++)
119 for(int j=0; j<m; j++)
120 {
121 if(matrix[i][j].data && matrix[i][j].status)
122 {
123 BFS(matrix[i][j]);
124 cnt++;
125 }
126 }
127 printf("%d\n", cnt);
128
129 return 0;
130 }
131 /*-------------------------迷宫问题--------------------*/
132 /*
133 Description:
134 给定一个n*m大小的迷宫,其中*代表不可通过的墙壁,而“.”代表平底,S表示起点,T表示终点。
135 移动过程中,如果当前位置是(x,y)(下标从0开始),且每次只能前往上下左右四个位置的平地,
136 求从起点到达终点的T的最小步数;
137
138 Sample Input:
139 . . . . .
140 . * . * .
141 . * S * .
142 . * * * .
143 . . . T *
144 */
145
146 #include <cstdio>
147 #include <queue>
148 using namespace std;
149 const int MAX_SIZE = 110;
150 struct node
151 {
152 char data;
153 bool status;
154 int x, y;
155 int level;
156 }matrix[MAX_SIZE][MAX_SIZE];
157
158 int n, m, X[4]={0,0,1,-1}, Y[4]={1,-1,0,0};
159 void Init()
160 {
161 scanf("%d%d", &n, &m);
162 getchar();
163 for(int i=0; i<n; i++)
164 {
165 for(int j=0; j<m; j++)
166 {
167 matrix[i][j].data = getchar();
168 getchar();
169 matrix[i][j].status = true;
170 matrix[i][j].x = i;
171 matrix[i][j].y = j;
172 }
173 }
174
175 }
176
177 int BFS(node s)
178 {
179 queue<node> q;
180 q.push(s);
181 matrix[s.x][s.y].level = 1;
182 while(!q.empty())
183 {
184 node v = q.front();
185 q.pop();
186 matrix[v.x][v.y].status = false;
187 for(int i=0; i<4; i++)
188 {
189 int nowX = v.x+X[i];
190 int nowY = v.y+Y[i];
191 if(nowX<0 || nowX>=n || nowY<0 || nowY>=m)
192 continue;
193 if(matrix[nowX][nowY].data=='.' && matrix[nowX][nowY].status)
194 {
195 q.push(matrix[nowX][nowY]);
196 matrix[nowX][nowY].level = matrix[v.x][v.y].level+1;
197 }
198 else if(matrix[nowX][nowY].data=='T')
199 return matrix[v.x][v.y].level;
200 }
201 }
202 return -1; //无法到达
203 }
204
205 int main()
206 {
207 #ifdef ONLINE_JUDGE
208 #else
209 freopen("Test.txt", "r", stdin);
210 #endif // ONLINE_JUDGE
211
212 Init();
213 for(int i=0; i<n; i++)
214 for(int j=0; j<m; j++)
215 if(matrix[i][j].data=='S')
216 printf("%d\n", BFS(matrix[i][j]));
217
218 return 0;
219 }