渣打科营 Mini Code Marathon

 
 
代码如下,据说格式错误,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 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值