算法竞赛入门经典第四章习题(10/10)
终于刷完第四章了,,第四章习题耗时良久,,记录下,
Xiangqi
题意:判断黑方是否被将死
题解:模拟象棋动作,判断将走前后左右是否能不被将死
1 |
|
Squares
题意:给你一个网,和连上的边,问你有几个正方形;
题解:根据边长遍历,一下下搜,判断能否形成正方形 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
using namespace std;
const int Ma = 11;
bool kj[2][Ma][Ma][Ma];
int n;
int fidn(int x){
int sl = 0;
for(int i = 1; i <= n - x; i++){
for(int j = 1; j <= n - x; j++){
int u;
for(u = 0; u < 4; u++){
int ii;
for(ii = 0; ii < x; ii++){
if(u % 2 == 0 && !kj[0][i + x * (u / 2)][j + ii][j + ii + 1])break;
else if(!kj[1][j + x * (u / 3)][i + ii][i + ii + 1])break;
}
if(ii != x)break;
}
if(u == 4)sl++;
}
}
return sl;
}
int main(){
int tot = 0, m;
while(~scanf("%d%d", &n, &m)){
if(tot)puts("\n**********************************\n");
printf("Problem #%d\n\n", ++tot);
memset(kj, 0, sizeof(kj));
while(m--){
char c[2];
int x, y;
scanf("%s%d%d", c, &x, &y);
if(x <= n && y < n)
kj[c[0] == 'H' ? 0 : 1][x][y][y + 1] = true;
}
bool chu = false;
for(int i = 1; i < n; i++){
int sl = fidn(i);
if(sl != 0)chu = true, printf("%d square (s) of size %d\n", sl, i);
}
if(!chu)puts("No completed squares can be found.");
}
return 0;
}
Othello
题意:模拟黑白棋,两枚黑棋夹住的白棋会变黑;
题解:题有些坑点,,默认一个棋手走完下一个棋手走,输出黑白棋时输出两位数,不满加空格,,在这里pe好多次,,(可能是我题没读仔细,,)
1 |
|
Cube painting
题意:判断两枚骰子是否相同;
题解:易证明骰子一样的话对面一定是同一对,根据这个进行判断;
1 |
|
IP Networks
题意:给你几个ip地址,让你输出最小的能包含他们的ip和子网掩码
题解:读入ip凭接在一起,不断求当前掩码,将这些数据当成二进制来计算,算是位运算的运用,当当前掩码和当前ip能包含输入ip时不进行运算;
1 |
|
Morse Mismatches
题意:给你morse编码和一个字典,让你根据这些输出密文,有多个时输出单词最短的并加上!,当不能完美匹配时输出删减或增加密文后能匹配的,并输出?,
题解:根据具题意模拟,
1 |
|
RAID!
题意:这题真的是题意读一年,,,,给n个磁盘让你判断能否恢复,若能输出恢复后的数据,
题解:输入是按磁盘来输入的,判断时得往下一列列判断,校验块有b块,d块出现一次;
1 |
|
Extraordinarily Tired Students
题意:每个学生有一个清醒周期和一个睡眠周期,当睡觉人数严格大于一半的人才能睡,不然就坚持一个清醒周期;
题解:直接模拟上课进程,当每个同学的状态和初始状态相同时进入循环,退出模拟,输出-1
1 |
|
Data Mining
题意:这题题意是真的恐怖,,半天读不明白,,为了精简除法的速度,tuple发现了一种用位运算来精简计算q的偏移值的公式,让你求公式中的A和B;
题解:直接枚举a和b,按常识来设定a和b的范围,计算q的总大小由一个q大小的位置加上有最后一个p地址计算出的偏移值的大小,根据算出来的值不能比原来的小的基础上尽量小来更新a和b;
1 |
|
Flooded!
题意:给你一个网格及其各个海拔,每个网格是10米的正方形,和网格内总的水量,外面是无限高的墙,问你水平面有多高, 和多少面积有水;
题解:将总的水量除以100,得到高度,将网格按海拔排序,水当前高度比下一块地高的话就淹没它,加上他的高度,每次用水除以已淹网格数的平均高度进行比较,最后输出总高度除以淹没网格数的海拔,以及已淹网格除以总网格数的淹没百分比;总的水量得用浮点存储,不然精度的丢失会导致与下个网格的比较出现问题;(我单词没拼对wa了好多发,,,下次一定用复制的,,,)
1 |
|