讲到稀疏数组,那常见的例子就是五子棋,稀疏数组就是为了减少空间资源浪费,来看一下将二维数组五子棋改写为稀疏数组。
生成数组(棋盘):
int wuziqi[][]=new int[11][11];
wuziqi[1][2]=1;
wuziqi[2][3]=2;
for(int row[]:wuziqi){
for(int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
有效数据个数:
int sum=0;
for(int row[]:wuziqi){
for (int data:row){
if(data!=0){
sum++;
}
}
}
创建稀疏数组:
int xishu[][]=new int[sum+1][3];
xishu[0][0]=11;
xishu[0][1]=11;
xishu[0][2]=sum;
int count=0;
for(int i=0;i<11;i++){
for (int j=0;j<11;j++){
if(wuziqi[i][j]!=0){
count++;
xishu[count][0]=i;
xishu[count][1]=j;
xishu[count][2]=wuziqi[i][j];
}
}
}
输出稀疏数组:
System.out.println();
for(int i=0;i<xishu.length;i++){
System.out.println(xishu[i][0]+"\t"+xishu[i][1]+"\t"+xishu[i][2]);
}
还原原数组:
int hy[][]=new int[xishu[0][0]][xishu[0][1]];
for (int i = 0; i < xishu[0][2]; i++) {
hy[xishu[i+1][0]][xishu[i+1][1]]=xishu[i+1][2];
}
输出原数组:
System.out.println();
for (int row[] : hy) {
for(int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
总程序算法:
输出一个11*11的棋盘,提取出相应棋子位置~
~
public class SparseArray {
public static void main(String[] args) {
//生成数组
int wuziqi[][]=new int[11][11];
wuziqi[1][2]=1;
wuziqi[2][3]=2;
for(int row[]:wuziqi){
for(int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
//生成稀疏数组
//得到有效数据的个数
int sum=0;
for(int row[]:wuziqi){
for (int data:row){
if(data!=0){
sum++;
}
}
}
//创建稀疏数组
int xishu[][]=new int[sum+1][3];
xishu[0][0]=11;
xishu[0][1]=11;
xishu[0][2]=sum;
int count=0;
for(int i=0;i<11;i++){
for (int j=0;j<11;j++){
if(wuziqi[i][j]!=0){
count++;
xishu[count][0]=i;
xishu[count][1]=j;
xishu[count][2]=wuziqi[i][j];
}
}
}
//输出稀疏数组
System.out.println();
for(int i=0;i<xishu.length;i++){
System.out.println(xishu[i][0]+"\t"+xishu[i][1]+"\t"+xishu[i][2]);
}
//还原原数组
int hy[][]=new int[xishu[0][0]][xishu[0][1]];
for (int i = 0; i < xishu[0][2]; i++) {
hy[xishu[i+1][0]][xishu[i+1][1]]=xishu[i+1][2];
}
//输出原数组
System.out.println();
for (int row[] : hy) {
for(int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}