|
本帖最后由 chuxf 于 2014-3-6 19:22 编辑
我这里有个死办法,那就是如果有上下左右的联通,则移动整个区域,直到不再联通为止。(记录下 X Y 的偏移量)
最后算出重心,再把偏移量加回去。
[Fortran] 纯文本查看 复制代码 003 | Integer , parameter :: N = 4 |
004 | Integer , parameter :: M = 4 |
006 | Integer :: a ( M , N ) |
007 | Open ( 12 , File = '文件名' ) |
010 | call IslandGravity ( a , N , M , gx , gy ) |
015 | Subroutine IslandGravity ( d , n , m , gx , gy ) |
017 | Integer :: d ( m , n ) , a ( m , n ) |
018 | integer :: i , j , c , iShiftX , iShiftY |
026 | blink = Check_Y_Link ( a , n , m ) |
028 | call RollUp ( a , n , m ) |
029 | iShiftY = iShiftY + 1 |
035 | blink = Check_X_Link ( a , n , m ) |
037 | call RollLeft ( a , n , m ) |
038 | iShiftX = iShiftX + 1 |
048 | if ( a ( j , i ) == 1 ) then |
055 | gx = ( gx / c ) + iShiftX |
056 | if ( gx > m ) gx = gx - m |
057 | gy = ( gy / c ) + iShiftY |
058 | if ( gy > n ) gy = gy - n |
059 | End Subroutine IslandGravity |
061 | Subroutine RollUp ( a , n , m ) |
063 | Integer :: a ( m , n ) , t ( m ) |
065 | a ( : , 1 : n -1 ) = a ( : , 2 : n ) |
067 | End Subroutine RollUp |
069 | Subroutine RollLeft ( a , n , m ) |
071 | Integer :: a ( m , n ) , t ( n ) |
073 | a ( 1 : m -1 , : ) = a ( 2 : m , : ) |
075 | End Subroutine RollLeft |
077 | Logical Function Check_Y_Link ( a , n , m ) |
079 | Integer :: a ( m , n ) |
081 | Check_Y_Link = .false. |
083 | if ( ( a ( i , 1 ) == 1 ) .and. ( a ( i , n ) == 1 ) ) then |
084 | Check_Y_Link = .true. |
088 | End Function Check_Y_Link |
090 | Logical Function Check_X_Link ( a , n , m ) |
092 | Integer :: a ( m , n ) |
094 | Check_X_Link = .false. |
096 | if ( ( a ( 1 , i ) == 1 ) .and. ( a ( m , i ) == 1 ) ) then |
097 | Check_X_Link = .true. |
101 | End Function Check_X_Link |
103 | End Program www_fcode_cn |
|
|