代码如下,据说格式错误,nnd
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef
struct
MatrixListNode_stru
{
int
n
;
int
m
;
char
*
matrix
;
struct
MatrixListNode_stru
*
next
;
}
MatrixListNode_stru
;
int
connect
(
MatrixListNode_stru
*
pMatrixStru
);
int
main
(
void
)
{
//demo data
//char input[1024] ="3 3 100 101 111 4 3 111 101 101 101 1 5 01110";
char
input
[
1024
];
gets
(
input
);
//split str into struct
MatrixListNode_stru
*
dataList
=
NULL
;
MatrixListNode_stru
*
currNode
=
NULL
;
char
*
pch
;
int
count
=
0
;
pch
=
strtok
(
input
,
" "
);
while
(
NULL
!=
pch
){
++
count
;
if
(
1
==
count
){
if
(
NULL
==
dataList
){
dataList
=
(
MatrixListNode_stru
*
)
malloc
(
sizeof
(
MatrixListNode_stru
)
*
1
);
dataList
->
next
=
NULL
;
currNode
=
dataList
;
}
else
{
currNode
=
dataList
;
while
(
NULL
!=
currNode
->
next
){
currNode
=
currNode
->
next
;
}
currNode
->
next
=
(
MatrixListNode_stru
*
)
malloc
(
sizeof
(
MatrixListNode_stru
)
*
1
);
currNode
=
currNode
->
next
;
currNode
->
next
=
NULL
;
}
sscanf
(
pch
,
"%d"
,
&
currNode
->
n
);
}
else
if
(
2
==
count
){
sscanf
(
pch
,
"%d"
,
&
currNode
->
m
);
currNode
->
matrix
=
(
char
*
)
malloc
(
sizeof
(
char
)
*
((
currNode
->
n
*
currNode
->
m
)
+
1
));
int
i
;
for
(
i
=
0
;
i
<
currNode
->
n
*
currNode
->
m
;
++
i
)
currNode
->
matrix
[
i
]
=
'0'
;
currNode
->
matrix
[
currNode
->
n
*
currNode
->
m
]
=
'\0'
;
}
else
if
(
2
<
count
&&
count
<=
(
currNode
->
n
+
2
))
{
memcpy
(
currNode
->
matrix
+
(
count
-
3
)
*
currNode
->
m
,
pch
,
strlen
(
pch
));
//
if
(
count
==
(
currNode
->
n
+
2
))
count
=
0
;
}
pch
=
strtok
(
NULL
,
" "
);
}
//check split result
/*
currNode = dataList;
while(NULL != currNode ){
printf("n=%d, m=%d, matrix = %s\n", currNode->n, currNode->m, currNode->matrix);
currNode = currNode->next;
}
*/
//make data connected
currNode
=
dataList
;
while
(
NULL
!=
currNode
){
printf
(
"%d "
,
connect
(
currNode
));
currNode
=
currNode
->
next
;
}
printf
(
"
\n
"
);
//clean
currNode
=
dataList
;
MatrixListNode_stru
*
nodeNext
=
NULL
;
for
(;
currNode
!=
NULL
;
currNode
=
nodeNext
){
nodeNext
=
currNode
->
next
;
free
(
currNode
->
matrix
);
free
(
currNode
);
}
return
0
;
}
int
connect
(
MatrixListNode_stru
*
pMatrixStru
){
int
countChangedTotal
=
0
;
int
countChanged
=
0
;
int
isDone
=
0
;
int
i
;
// creat a new matrix
int
row
=
pMatrixStru
->
n
+
2
;
int
colum
=
pMatrixStru
->
m
+
2
;
char
*
newMatr
=
(
char
*
)
malloc
(
sizeof
(
char
)
*
(
row
*
colum
));
for
(
i
=
0
;
i
<
row
*
colum
;
++
i
){
newMatr
[
i
]
=
'0'
;
}
// put data in
for
(
i
=
0
;
i
<
pMatrixStru
->
n
;
++
i
){
memcpy
(
newMatr
+
(
i
+
1
)
*
colum
+
1
,
pMatrixStru
->
matrix
+
i
*
pMatrixStru
->
m
,
pMatrixStru
->
m
);
}
//change data
while
(
!
isDone
){
for
(
i
=
colum
;
i
<
(
row
-
1
)
*
colum
;
++
i
){
if
(
0
==
i
%
colum
||
0
==
(
i
+
1
)
%
colum
){
}
else
{
if
(
newMatr
[
i
]
==
'0'
){
//check it
int
fourWay
=
0
;
if
(
newMatr
[
i
+
1
]
==
'0'
)
++
fourWay
;
if
(
newMatr
[
i
-
1
]
==
'0'
)
++
fourWay
;
if
(
newMatr
[
i
-
colum
]
==
'0'
)
++
fourWay
;
if
(
newMatr
[
i
+
colum
]
==
'0'
)
++
fourWay
;
if
(
fourWay
<
2
){
//change it
newMatr
[
i
]
=
'1'
;
++
countChanged
;
}
}
}
}
if
(
0
==
countChanged
)
isDone
=
1
;
else
{
countChangedTotal
+=
countChanged
;
countChanged
=
0
;
}
}
free
(
newMatr
);
return
countChangedTotal
;
}