题1:回型矩阵,做这题的时候打的代码可读性比较差,代码逻辑也不是很清晰,乱调试混过去的...
我就是想弄个坐标轴,足够大,然后扫描回型矩阵的边长,“在最外层加一层墙”,然后从(1,1)开始往右走,撞墙就顺时针拐弯,跟贪吃蛇一样,不能撞到自己...记得弄个计数器,每走一步计数器加1,而且我们要在坐标中放置的值也是自增的。然后走完所有的步数就不走了。去下面输出每行的内容。
————————分割线————————
题2:蛇形矩阵,这题是比之前要难的我感觉...代码上不小心也很容易搞错,啥堆、栈内存溢出啊,段错误啊,数组越界啥的,我也懵懵的,总感觉没道理出现这些问题,调试了好久才发现原来有个num我拼成sum了...和之前那题一样,弄成坐标,然后一步一步走,这个蛇形走法,怎么说呢?它是斜着走的,像" / ",我自然就把移动状态分成两种,右上跟左下,不过在撞墙时它有其它的操作...
移动状态为右上时,运动方向优先级为:向右上>向右>向下 若它没办法向右上走,才会向右走,同理,不能向右走时才能向下走...。要注意,当它向右走或向下走的时候说明撞墙了,要拐弯,拐弯后反向,因此移动状态要改变。改为左下。
移动状态为左下时:优先级:向左下>向下>向右。。。
代码如下:
————————
#include
int sum[1001][1001] = { 0 };
int ti[1001][1001] = { 0 };
int main(void) {
int num = 1; //号码计数
int dir = 1; //1代表右上 2代表左下
int x = 1, y = 1; //初始坐标
int n; //矩阵规模
scanf("%d", &n);
int k = 0; //常用计数器
for (; k <= n; k++) {
ti[k][n + 1] = 1;
ti[n + 1][k] = 1;
ti[0][k] = 1;
ti[k][0] = 1;
}
while (num <= n * n) {
if ( x < 1 || y < 1) {
printf("Illegal variable x or y !\n");
break;
}
if (dir == 1) {
if (ti[x][y] == 0) {
ti[x][y] = 1;
sum[x][y] = num++;
continue;
}
else if (ti[x - 1][y + 1] == 0) {
x -= 1;
y += 1;
ti[x][y] = 1;
sum[x][y] = num++;
continue;
}
else if (ti[x][y + 1] == 0) {
y += 1;
ti[x][y] = 1;
sum[x][y] = num++;
dir = 2;
continue;
}
else if (ti[x + 1][y] == 0) {
x += 1;
ti[x][y] = 1;
sum[x][y] = num++;
dir = 2;
continue;
}
else {
printf("Discovered a unknow error!\n");
num++;
}
}else
if (dir == 2) {
if (ti[x][y] == 0) {
ti[x][y] = 1;
sum[x][y] = num++;
continue;
}
else if (ti[x + 1][y - 1] == 0) {
x += 1;
y -= 1;
ti[x][y] = 1;
sum[x][y] = num++;
continue;
}
else if (ti[x + 1][y] == 0) {
x += 1;
ti[x][y] = 1;
sum[x][y] = num++;
dir = 1;
continue;
}
else if (ti[x][y + 1] == 0) {
y += 1;
ti[x][y] = 1;
sum[x][y] = num++;
dir = 1;
continue;
}
else {
printf("Discovered a unknow error!\n");
num++;
}
}
}
x = 1;
for (; x <= n; x++) {
y = 1;
for (; y < n; y++) {
printf("%d ", sum[x][y]);
}
printf("%d\n", sum[x][n]);
}
}
————————
有些内容是不必要的,当时调试的时候为了看出哪里出问题了所以加了点东西。
————————分割线————————
题3:扫雷,输入一个矩形的内容,' ? '代表未知数字,' * ' 代表一个地雷,输出时要把未知的数字变成确切的数字,也就是以该点为中心的九宫格内地雷总数。刚开始不知道咋处理好,想把所有字符接收到二维字符数组当中,照样是用坐标的方法,然后逐个位判断时都循环逛一遍九宫格,统计个数输出。可是想想就觉得麻烦,没准弄半天最后还超时了,也就没下手。后来在草稿纸上画表格,想看看数字之间有没有啥规律,...每次临时想多加个地雷,旁边的数据又要修改掉,改着改着,忽然觉得可以创建个字符数组用来储存字符,同时创建一个二维数组sum用来储存坐标上的值,检测所有的字符,检测到地雷时取出其坐标,把旁边一圈的坐标储存的数值都加上1,最后输出的时候用字符数组判断该点是不是地雷点,是就输出' * ',不是就输出该坐标sum数组对应的值。要注意换行的规律。
代码如下:
————————
#include
int main(void){
int row,line;
char alp[105][105];
int sum[105][105]={0};
scanf("%d %d",&row,&line);
getchar();
int k = 1;
while(k<=row){
int i = 1;
while(i<=line){
alp[k][i]=getchar();
if(alp[k][i]=='*'){
sum[k-1][i-1]++; //左上
sum[k-1][i]++; //上
sum[k-1][i+1]++; //右上
sum[k][i+1]++; //右
sum[k+1][i+1]++; //右下
sum[k+1][i]++; //下
sum[k+1][i-1]++; //左下
sum[k][i-1]++; //左
}
i++;
}
getchar();
k++;
}
k = 1;while(k<=row){
int i = 1;
while(i<=line){
if(alp[k][i]=='*'){
putchar('*');
}else if(alp[k][i]=='?'){
printf("%d",sum[k][i]);
}
i++;
}
putchar('\n');
k++;
}
}
————————
题4:简言之,给你个矩形的一堆字母,判断多少个2*2矩阵里的内容包含'f' 'a' 'c' 'e'四个字母。输出这个数。
看到这题最先想到的就是循环判断所有的2*2矩阵,把四个字母加起来,看值和f+a+c+e是不是相等(ASCII码相加),可是显然这是十分不严谨的。比如:f+a+c+e==e+b+d+d...后来去群里请教别人,别人说,相乘。嗯...是比相加好多了...于是我就用了相乘的值是否相等来判断矩阵的内容是否等价...
代码如下:
————————
#include
int main(void){
const int value = 'f'*'a'*'c'*'e';
int add = 0;
char alp[55][55]={0};
int row,line;
scanf("%d %d",&row,&line);
getchar();
int k = 1;
while(k<=row){
int i = 1;
while(i<=line){
alp[k][i]=getchar();
i++;
}
getchar();
k++;
}
k = 1;
while(k
int i = 1;
while(i
if((alp[k][i]*alp[k][i+1]*alp[k+1][i]*alp[k+1][i+1])==value)
add++;
i++;
}
k++;
}
printf("%d",add);
}
————————
后面的几道题就是那种注意细节就能过的题了,不多说了。牛客基础过关就到这了。