【题解】 —算法竞赛入门经典第二版 【第六章习题】【2/14】

UVa 673 Parentheses Balance 【stack】

题目大意:

括号匹配

解题思路:

借助栈来实现的括号匹配,最基础的应用。
注意可能出现的不匹配情况:1.数量不匹配 2.类型不匹配

Mycode:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
using namespace std;

int t;
string s;
int main()
{
cin >> t;
getchar();
while(t--)
{
getline(cin, s);
bool flag = true;
stack<char> S;
for(int i = 0; i < s.size() && flag; ++i)
{
if(s[i] == '(' || s[i] == '[')
S.push(s[i]);
else if(s[i] == ')')
{
if(!S.empty() && S.top() == '(')
S.pop();
else
flag = false;
}
else if(s[i] == ']')
{
if(!S.empty() && S.top() == '[')
S.pop();
else
flag = false;
}
}
if(!S.empty()) flag = false;
puts(flag ? "Yes" : "No");
}
return 0;
}

UVa 439 Knight Moves【BFS】

题目大意:

在一个8 * 8的棋盘上给你一个象棋“马”的位置,问这个马能最少用多少步到达目标位置。
马行走的方式为“日”字型。

解题思路:

因为范围很小,直接BFS即可,这里搜的时候同时记录走过的位置。

Mycode:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;

bool vis[11][11];
char s1[5], s2[5];
int stx, sty, enx, eny;
int dir[][2] = {1,2,-1,2,2,1,-2,1,-1,-2,-2,-1,1,-2,2,-1};
struct node
{
int x, y, cnt;
};
bool check(int x, int y)
{
if(vis[x][y]) return false;
if(x < 1 || x > 8 || y < 1 || y > 8) return false;
return true;
}
int main()
{
while(~scanf("%s%s", s1, s2))
{
memset(vis, 0, sizeof(vis));
stx = s1[0] - 'a' + 1;
sty = s1[1] - '1' + 1;
enx = s2[0] - 'a' + 1;
eny = s2[1] - '1' + 1;
vis[stx][sty] = 1;
node now, nex;
queue<node> Q;
Q.push(node{stx, sty, 0});
while(!Q.empty())
{
now = Q.front();
if(now.x == enx && now.y == eny)
{
printf("To get from %s to %s takes %d knight moves.\n", s1, s2, now.cnt);
break;
}
Q.pop();
for(int i = 0; i < 8; ++i)
{
nex.x = now.x + dir[i][0];
nex.y = now.y + dir[i][1];
if(!check(nex.x, nex.y)) continue;
nex.cnt = now.cnt + 1;
Q.push(nex);
}
}
}
return 0;
}
Donate comment here
0%