《算法竞赛入门经典(第二版)》第三章习题(5-6)
2018-02-04 15:32
501 查看
3-5 谜题
有一个5*5的网络,恰好有一个格子是空的,其他格子各有一个字母,一共四种指令,A,B,L,R,分别表示把空格的上下左右的相邻字幕移到空格中。输入初始网络和指令序列(以0结束),输出指令执行完毕后的网络,如果有非法指令,应输出,“This puzzle has no final configuration.”
思路: 类似于蛇形填数,首先把5*5网络填完,因为有空格所以用了getchar,循环输入的时候记录下空格所在位置
3-6 纵横字谜的答案
ps:越是到后面越是感到困难,不过没事儿,慢慢来把
有一个5*5的网络,恰好有一个格子是空的,其他格子各有一个字母,一共四种指令,A,B,L,R,分别表示把空格的上下左右的相邻字幕移到空格中。输入初始网络和指令序列(以0结束),输出指令执行完毕后的网络,如果有非法指令,应输出,“This puzzle has no final configuration.”
思路: 类似于蛇形填数,首先把5*5网络填完,因为有空格所以用了getchar,循环输入的时候记录下空格所在位置
#include <stdio.h> #include <string.h> const int maxn = 10; char a[maxn][maxn]; char b; int main() { memset(a,0,sizeof(a)); int m,n; bool error = false; for (int i = 0; i < 5; i ++) for (int j = 0; j < 5; j++) { a[i][j] = getchar(); if(a[i][j] == ' ') { m = i; n = j; } } getchar(); while ((b = getchar()) != EOF & b != '0') { if (b == 'A') { a[m] = a[m-1] ; m--; a[m] = ' '; } else if (b == 'B') { a[m] = a[m+1] ; ++m; a[m] = ' '; } else if (b == 'L') { a[m] = a[m][n-1]; --n; a[m] = ' '; } else if (b == 'R') { a[m] = a[m][n+1]; ++n; a[m] = ' '; } else { printf("This puzzle has no final configuration\n"); error = true; break; } } if(!error) { for (int i = 0;i < 5; i++) { for (int j = 0; j < 5; j++) printf("%c\t",a[i][j]); putchar('\n'); } } return 0; }
3-6 纵横字谜的答案
#include <bits/stdc++.h> const int maxn = 10; int main() { int t = 0; int n, m; char s[maxn][maxn+1]; int cnt = 0; int pos[maxn*maxn+1][2];//0,1分别代表行与列 while (scanf("%d", &n) != EOF && n) { scanf("%d", &m); getchar();//因为字母也是靠getchar()获得的而且前面会出现回车,因此这里调用一下 cnt = 0; memset(pos, 0, sizeof(pos)); for (int i = 0; i < n; i ++) { for (int j = 0; j < m; j ++) { s[i][j] = getchar(); if (s[i][j] == '*') continue; if (i == 0 || j == 0 || s[i-1][j] == '*' || s[i][j-1] == '*') { pos[cnt][0] = i, pos[cnt][1] = j;//将每个满足条件的元素的位置按顺序记录下来 cnt ++; } } getchar(); } if (t > 0) printf("\n"); printf("puzzle #%d:\n", ++t); printf("Across\n"); for (int k = 0; k < cnt; k ++) { int i = pos[k][0], j = pos[k][1];//将满足条件的字母的位置传递过来 if (j > 0 && s[i][j-1] != '*') continue; printf("%3d.", k+1); do { printf("%c< 4000 /span>", s[i][j]); j++; } while (j < m && s[i][j] != '*');//按行输出 printf("\n"); } printf("Down\n"); for (int k = 0; k < cnt; k ++) { int i = pos[k][0], j = pos[k][1]; if (i > 0 && s[i-1][j] != '*') continue; printf("%3d.", k+1); do { printf("%c", s[i][j]); i ++; } while (i < n && s[i][j] != '*');//按列输出 printf("\n"); } } return 0; }
ps:越是到后面越是感到困难,不过没事儿,慢慢来把
相关文章推荐
- 《算法竞赛入门经典(第二版)》第三章 习题(1-5)
- 《算法竞赛入门经典(第二版)》第三章习题(1-4)
- 《算法竞赛入门经典(第二版)》第三章 习题(6-9)
- 算法竞赛入门经典(第二版)-刘汝佳-第三章 数组与字符串 例题+习题(17/18)
- 算法竞赛入门经典第二版第三章习题
- 算法竞赛入门经典(第二版)第三章课后习题(1-4)未完待续
- 算法竞赛入门经典 第二版 习题4-4 骰子涂色 Cube painting uva253
- 鸟哥的Linux私房菜基础学习篇(第二版)第三章课后习题与答案
- 算法竞赛入门经典(第二版)第三章--回文字
- 刘汝佳《算法竞赛入门经典(第二版)》习题(九)
- 算法竞赛入门经典(第二版) 习题3-8 循环小数(Repeating Decimals) UVa202 Finals1990
- 算法竞赛入门经典 第二版 习题5-4 交换学生 Foreign Exchange uva10763
- 算法竞赛入门经典(第二版) 习题训练
- 算法竞赛入门经典 第二版 习题5-9 找bug Bug Hunt uva1596
- 编程珠玑第二版第三章习题(Java)
- 算法竞赛入门经典第三章习题总结(记录向)
- 算法竞赛入门经典(第二版)第二章 习题2-2 韩信点兵
- 算法竞赛入门经典 第二版 习题4-10 洪水 Flooded uva815
- 算法竞赛入门经典(第二版)第一章课后习题
- 《算法竞赛入门经典》第三章习题 (2)