一:贪吃蛇填数
在n*n的矩阵中,填入矩阵维度,然后形成一个蛇形矩阵,例如,当填入维度为4时,形成的蛇形矩阵:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
思路分析
可以想象对这个蛇形矩阵的绘制时,是在绘制一条路。笔的起点是在第一行的最后一列。笔的轨迹是下,下,下,左,左,左,上,上,上,右,右,下,下,左,上。那么关键点就在于,何时转弯,转弯的时候涉及到了矩阵的边界,那么我们就可以通过矩阵的边界来判断是否转弯。
例如:假如我们使用a[x][y]来表示这个矩阵
1,2,3,4由于此时笔是从上到下的,到达4时,此时笔的位置是a[3][3],此时笔再往下(即++x),那么矩阵将会越界,所以此时我们让笔的方向改变为从右到左 。
5 , 6 , 7,此时笔的方向是从右到左(即–y),到达7时,此时笔再往左,那么矩阵将会越界,因此我们改变方向为从下到上。
以此类推
代码实现
#include <stdio.h>
#define maxn 20
int a[maxn][maxn];
int main(){
int x, y, n, tmp;
printf("请输入矩阵的维度:\n");
scanf("%d", &n);
memset(a,0,sizeof(a));
tmp = a[x=0][y=n-1] = 1;
while(tmp < n*n){
while(x+1<n && !a[x+1][y]) a[++x][y] = ++tmp;
while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++tmp;
while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++tmp;
while(y+1<n && !a[x][y+1]) a[x][++y] = ++tmp;
}
for(x = 0; x < n; x++){
for(y = 0; y < n; y++){
printf("%3d", a[x][y]);
}
printf("\n");
}
}
结果:
二:猜数字游戏
一个经典的猜数字游戏,给定答案序列,每一个用户输入猜的序列,统计有多少个数字猜中(A),有多少个数字在两个序列都出现过,但是位置不对(B),输入0序列退出。
例如:
给定答案序列:1,2,3,4
用户猜1,3,5,6
那么A和B对应的值为:(1,1)
思路分析
A很容易得到,只需要判断输入的每一个数在答案序列中是否存在,存在便+1。
B则有点麻烦,可以这样来实现:统计1-9每一个数字在答案序列和用户猜的序列的出现次数分别为c1,c2,取最小的为B。1-9遍历的B累加,最后减去A,便是在两个序列都出现过,但是位置不对的数目。
代码实现
#include <stdio.h>
#define maxn 100
int main(){
int a[maxn], b[maxn], n, i ,j;
scanf("%d", &n);
//输入答案序列
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
//输入猜序列
for(;;){
int A=0, B=0;
for(i = 0; i < n; i++){
scanf("%d", &b[i]);
if(b[i] == a[i]){
A++;
}
}
if(b[0] == 0) break;
//计算B
for(i = 1; i <= 9; i++){
int c1=0, c2=0;
for(j = 0; j < n;j++){
if(i == a[j]) c1++;
if(i == b[j]) c2++;
}
if(c1 < c2){
B += c1;
}else{
B += c2;
}
}
printf(" (%d,%d)", A, B-A);
}
}
结果: