您的位置:首页 > 其它

《算法竞赛入门经典(第二版)》第三章习题(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,循环输入的时候记录下空格所在位置

#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:越是到后面越是感到困难,不过没事儿,慢慢来把
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法