目录
4、习题3-2 分子量(Molar Mass, ACM/ICPC Seoul 2007, UVa1586)
6、习题3-5 谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)
1、程序3-3 蛇形填数
在n×n方阵里填入1,2,…,n×n,要求填成蛇形。例如,n=4时方阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
思路:
找到程序的起点和终点,发现起点为矩阵右上角,需要控制行终点和列终点,分为四次循环分别打印,从上往下、从右往左、从下往上、从左往右,直到循环次数到n*n。
#include <stdio.h>
#include <string.h>
int arr[100][100] = {0};
int main ()
{
int n;
while(scanf("%d", &n)!= EOF)
{
memset(arr, 0, sizeof(arr));
int i = 0, j = n-1, sum = 1;
arr[i][j]=1;
while(sum < n*n)
{
while(i+1<n && !arr[i+1][j]) arr[++i][j] = ++sum;
while(j-1>=0 && !arr[i][j-1]) arr[i][--j] = ++sum;
while(i-1>=0 && !arr[i-1][j]) arr[--i][j] = ++sum;
while(j+1<n && !arr[i][j+1]) arr[i][++j] = ++sum;
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
printf("%3d ", arr[i][j]);
printf("\n");
}
}
return 0;
}
看大神博客发现类似的题目记录下:
原帖链接:https://blog.csdn.net/qq_36238595/article/details/53537672
斜着打印
1 3 6 10
2 5 9
4 8
7
输入层数n,打印类似图案。
#include <stdio.h>
int a[10][10]= {0};
int main()
{
int n, i = 1, j, x = 1, y = 0, c = 1;
a[0][0] = 1;
scanf("%d",&n);
while (i<n)
{
x = i;
y = 0;
while (y<i || y==i)
{
a[x--][y++] = ++c;
}
i++;
}
for (i=0; i<n; i++)
{
for(j=0; j<n-i; j++)
printf("%3d",a[i][j]);
printf("\n");
}
}
2、程序3-7 回文词
输入一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字0。所谓回文串,就是反转以后和原串相同,如abba和madam。所有镜像串,就是左右镜像之后和原串相同,如2S和3AIAE。注意,并不是每个字符在镜像之后都能得到一个合法字符。在本题中,每个字符的镜像如图所示(空白项表示该字符镜像后不能得到一个合法字符)。
输入的每行包含一个字符串(保证只有上述字符。不含空白字符),判断它是否为回文串和镜像串(共4种组合)。每组数据之后输出一个空行。
样例输入:
NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA
样例输出:
NOTAPALINDROME -- is not a palindrome.
ISAPALINILAPASI -- is a regular palindrome.
2A3MEAS -- is a mirrored string.
ATOYOTA -- is a mirrored palindrome.
分析:
回文串比较好判断,前后比较就行了,镜像串需要先看有没有镜像文字,然后比较。
书中用数组存储镜像文字比较简单。
#include<stdio.h>
#include<string.h>
#include<ctype.h>
const char* rev = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";
const char* msg[] = {"not a palindrome", "a regular palindrome", "a mirrored string", "a mirrored palindrome"};
char r(char ch)
{
if(isalpha(ch))
return rev[ch - 'A'];
return rev[ch - '0' + 25];
}
int main()
{
char s[30];
while(scanf("%s", s) == 1)
{
int len = strlen(s);
int p = 1, m