Will it float?
Matlab, 106 bytes
s=input('');im=~(s-32);c=bwconncomp(im,4);disp(~nnz(cellfun(@nnz,c.PixelIdxList)>3)&nnz(unique(s(~im)))<2)
The input is a matrix of characters, e.g. for the first test case:
`['$$$$$$$$';'***$$$$$';'***$$$$$';'***$$$$$';'$$$$$$$$']`
Explanation:
s=input(''); %read input
im=~(s-32); %convert input to bw image (space = black)
c=bwconncomp(im,4); %calculate the connected components (4 connectivity)
disp(
~nnz(cellfun(@nnz,c.PixelIdxList)>3) %find out whether we have components that have more at least 4 pixels
&nnz(unique(s(~im)))<2) %find out if we have more than 1 non-space character
APL (Dyalog Unicode), 76 bytes
{(1=≢∪' '~⍨∊⍵)∧×/5>a/⍨×a←∊g↓⍉↑(g←{⊃,/{×⊃⍵:+/⍵⋄⍵}¨⍵⊂⍨1,2{≠/0=⊃¨⍺⍵}/⍵}¨)' '=⍵}
Try it online!
Accepts input as a list of strings.
1 for floating, and 0 for sinking.
Explanation
{(1=≢∪' '~⍨∊⍵)∧×/5>a/⍨×a←∊g↓⍉↑(g←{⊃,/{×⊃⍵:+/⍵⋄⍵}¨⍵⊂⍨1,2{≠/0=⊃¨⍺⍵}/⍵}¨)' '=⍵}
' '=⍵ boolean array for spaces
(g←{⊃,/{×⊃⍵:+/⍵⋄⍵}¨⍵⊂⍨1,2{≠/0=⊃¨⍺⍵}/⍵}¨) apply the following function g to each row:
1,2{≠/0=⊃¨⍺⍵}/⍵ get the start of each group of zeroes/nonzero values
⍵⊂⍨ cut the list according to that
{×⊃⍵:+/⍵⋄⍵}¨ sum each nonzero array
⊃,/ join all of that together
g↓⍉↑ apply g again on the transpose
a/⍨×a←∊ flatten and remove zeroes
×/5> are all sums ≤ 4?
∧ and
' '~⍨∊⍵ the boat with spaces removed
∪ uniquified
1=≢ has only 1 element?