改变矩阵元素的位置
2016-01-21 22:02
323 查看
/**********
【习题7.067】编写函数将一个NxN的二维数组的周边元素
“顺时针”轮转1位。
例如:轮转前的数组 轮转后的数组
1 2 3 4 1 2
4 5 6 ---> 7 5 3
7 8 9 8 9 6
**********/
void turningClockwise(char a
)
{
char t;
int i;
t=a[0][N-1];
for(i=N-1;i>0;i--)a[0][i]=a[0][i-1];
for(i=0;i<N-1;i++)a[i][0]=a[i+1][0];
for(i=0;i<N-1;i++)a[N-1][i]=a[N-1][i+1];
for(i=N-1;i>0;i--)a[i][N-1]=a[i-1][N-1];
a[1][N-1]=t;
}
/***********************/
这是anyview上面的一题,一开始也不太会最后参考了一下答案。我觉得答案提供了一种新的思路呢,就是要像这样换位置的话就应该先把一个元素拿出来,之后再用循环移动,而且这个循环是分开的,每个循环负责一定的区域。最后等到所有的元素移完位后,再把先前拿出来的元素再补上去。
/******由此可以引申******/
可以逆时针旋转,也就和上面那个差不多。
也可以左轮转,右轮转,上轮转,下轮转。相比上面,不同的只是把拿出来的一堆元素放在一个数组里面。
/**********
【习题7.072】编写函数将一个NxN的二维数组a的元素
按行向右轮转1位。
例如:轮转前的数组 轮转后的数组
1 2 3 3 1 2
4 5 6 ---> 6 4 5
7 8 9 9 7 8
**********/
void turningRight(char a
)
{
int i,j;
char t
;
for(i=0;i<N;i++)t[i]=a[i][0];
for(i=0;i<N;i++)a[i][0]=a[i][N-1];
for(j=N-1;j>0;j--)
for(i=0;i<N;i++)a[i][j]=a[i][j-1];
for(i=0;i<N;i++)a[i][1]=t[i];
}
/******************************/
然后自己在codeblock上面又打了一次,当然这不像anyview一样有外部文件,所以就自己定义了一下。
但是自己打的话还是有很多问题的呢,我想输入和输出一个矩阵,但是输入时因为字符空格会被接收的问题,最终还是没想到,只好直接定义了,希望看到这里的大神们能告诉我一下怎么才能输入一个字符的矩阵。
试了一下N取其他值的,都可以运行。
/*********************************/
#include<stdio.h>
#define N 4
int main()
{
int i,j;
char a
={{'a','b','c','d'},{'e','f','g','h'},{'i','j','k','l'},{'m','n','o','p'}};/****这里要注意一下,‘10’,‘11’等并不是一个字符,被坑了好久****/
char t
;
for(i=0;i<N;i++)
for(j=0;j<N;j++)scanf("%c",&a
);
for(i=0;i<N;i++)t[i]=a[i][0];
for(i=0;i<N;i++)a[i][0]=a[i][N-1];
for(j=N-1;j>0;j--)
for(i=0;i<N;i++)a[i][j]=a[i][j-1];
for(i=0;i<N;i++)a[i][1]=t[i];
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
printf("%c\t",a[i][j]);
if(j==N-1)printf("\n");
}
}
做了这题后呢,获得的新思路就是要像这样换位置的话就应该先把一个元素拿出来,之后再用循环移动,而且这个循环是分开的,每个循环负责一定的区域。最后等到所有的元素移完位后,再把先前拿出来的元素再补上去。
【习题7.067】编写函数将一个NxN的二维数组的周边元素
“顺时针”轮转1位。
例如:轮转前的数组 轮转后的数组
1 2 3 4 1 2
4 5 6 ---> 7 5 3
7 8 9 8 9 6
**********/
void turningClockwise(char a
)
{
char t;
int i;
t=a[0][N-1];
for(i=N-1;i>0;i--)a[0][i]=a[0][i-1];
for(i=0;i<N-1;i++)a[i][0]=a[i+1][0];
for(i=0;i<N-1;i++)a[N-1][i]=a[N-1][i+1];
for(i=N-1;i>0;i--)a[i][N-1]=a[i-1][N-1];
a[1][N-1]=t;
}
/***********************/
这是anyview上面的一题,一开始也不太会最后参考了一下答案。我觉得答案提供了一种新的思路呢,就是要像这样换位置的话就应该先把一个元素拿出来,之后再用循环移动,而且这个循环是分开的,每个循环负责一定的区域。最后等到所有的元素移完位后,再把先前拿出来的元素再补上去。
/******由此可以引申******/
可以逆时针旋转,也就和上面那个差不多。
也可以左轮转,右轮转,上轮转,下轮转。相比上面,不同的只是把拿出来的一堆元素放在一个数组里面。
/**********
【习题7.072】编写函数将一个NxN的二维数组a的元素
按行向右轮转1位。
例如:轮转前的数组 轮转后的数组
1 2 3 3 1 2
4 5 6 ---> 6 4 5
7 8 9 9 7 8
**********/
void turningRight(char a
)
{
int i,j;
char t
;
for(i=0;i<N;i++)t[i]=a[i][0];
for(i=0;i<N;i++)a[i][0]=a[i][N-1];
for(j=N-1;j>0;j--)
for(i=0;i<N;i++)a[i][j]=a[i][j-1];
for(i=0;i<N;i++)a[i][1]=t[i];
}
/******************************/
然后自己在codeblock上面又打了一次,当然这不像anyview一样有外部文件,所以就自己定义了一下。
但是自己打的话还是有很多问题的呢,我想输入和输出一个矩阵,但是输入时因为字符空格会被接收的问题,最终还是没想到,只好直接定义了,希望看到这里的大神们能告诉我一下怎么才能输入一个字符的矩阵。
试了一下N取其他值的,都可以运行。
/*********************************/
#include<stdio.h>
#define N 4
int main()
{
int i,j;
char a
={{'a','b','c','d'},{'e','f','g','h'},{'i','j','k','l'},{'m','n','o','p'}};/****这里要注意一下,‘10’,‘11’等并不是一个字符,被坑了好久****/
char t
;
for(i=0;i<N;i++)
for(j=0;j<N;j++)scanf("%c",&a
);
for(i=0;i<N;i++)t[i]=a[i][0];
for(i=0;i<N;i++)a[i][0]=a[i][N-1];
for(j=N-1;j>0;j--)
for(i=0;i<N;i++)a[i][j]=a[i][j-1];
for(i=0;i<N;i++)a[i][1]=t[i];
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
printf("%c\t",a[i][j]);
if(j==N-1)printf("\n");
}
}
做了这题后呢,获得的新思路就是要像这样换位置的话就应该先把一个元素拿出来,之后再用循环移动,而且这个循环是分开的,每个循环负责一定的区域。最后等到所有的元素移完位后,再把先前拿出来的元素再补上去。
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua和C语言的交互详解
- Lua实现split函数
- Lua中使用二维数组实例
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结
- Lua学习笔记之表和函数
- Lua中实现sleep函数功能的4种方法