May the fourth be with flu
APL (Dyalog 16.0), 54 characters or 60 bytes
Takes enclosed matrix as argument, returns the step number which completes infection, i.e. 1=is already fully infected. 0=does not fully spread, which is just 1 + the OP's numbers.
54 characters (Unicode):
(≢×0=0∊⊃){(⊢≡f←⊢∨2≤{+/,⍵×3 3⍴0 1}⌺3 3)⊃⍵:⍵⋄(⊂f⊃⍵),⍵}⍣≡
60 bytes (Classic):
(≢×0=0∊⊃){(⊢≡f←⊢∨2≤{+/,⍵×3 3⍴0 1}⎕U233A 3 3)⊃⍵:⍵⋄(⊂f⊃⍵),⍵}⍣≡
⌺
is equivalent to ⎕U233A
Examples' run:
g←(≢×0=0∊⊃){(⊢≡f←⊢∨2≤{+/,⍵×3 3⍴0 1}⌺3 3)⊃⍵:⍵ ⋄ (⊂f⊃⍵),⍵}⍣≡
⎕IO←0
b←⊂⊖⍉~@(⎕JSON'[[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[5,0]]')⊢0⍴⍨2⍴6
g b
8
b←⊂⊖⍉~@(⎕JSON'[[1,1],[0,3],[1,0],[3,0],[3,3]]')⊢0⍴⍨2⍴4
g b
10
The steps are as follows:
┌─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┐ │ X X │ X X X │ X X X X │ X X X X X │ X X X X X │ X X X X X │ X X X X X │ X X X X X X │ │ X │ X X X │ X X X X │ X X X X X │ X X X X X │ X X X X X │ X X X X X X │ X X X X X X │ │ X X │ X X X │ X X X X │ X X X X │ X X X X X │ X X X X X X │ X X X X X X │ X X X X X X │ │ │ X │ X X X │ X X X X X │ X X X X X X │ X X X X X X │ X X X X X X │ X X X X X X │ │ X │ X X │ X X X │ X X X X X │ X X X X X X │ X X X X X X │ X X X X X X │ X X X X X X │ │ X X │ X X X X │ X X X X │ X X X X │ X X X X X │ X X X X X X │ X X X X X X │ X X X X X X │ └─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┘ ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐ │ X X │ X X │ X X │ X X │ X X │ X X │ X X X │ X X X X │ X X X X │ X X X X │ │ │ │ │ │ X │ X X │ X X X │ X X X X │ X X X X │ X X X X │ │ X │ X │ X X │ X X X │ X X X │ X X X │ X X X │ X X X │ X X X X │ X X X X │ │ X X │ X X X │ X X X │ X X X │ X X X │ X X X │ X X X │ X X X │ X X X │ X X X X │ └─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘
MATL, 29 28 bytes
tn:"tlY6Z+1>Z|t?@.]]Nl=?l_]&
Input is in the form of a 2D matrix of 1's and 0's
Try it at MATL Online
Explanation
% Implicitly grab user input as a 2D matrix
t % Duplicate the inputs
n: % Count the number of elements in the input (N) and create the array [1...N]
" % Loop this many times (maximum number of steps we analyze)
t % Duplicate the top element
lY6 % Push the 2D array => [0 1 0; 1 0 1; 0 1 0]
Z+ % Perform 2D convolution (and maintain the size)
l> % Find all values that are >= 2
Z| % Perform an element-wise OR with the previous state
t? % If all elements are 1's
@. % Push the current index and break out of the loop
] % End of if
] % End of for loop
Nl=? % If there is only one element on the stack
l_ % Push a negative one
] % End of if statement
& % Display the top stack element
Python, 231 bytes
g=input()
q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0
m=len(g);p=t=0;n=range(m)
while not all([r for k in g for r in k]):h=[[g[r][c]or sum([q(r+1,c),q(r-1,c),q(r,c+1),q(r,c-1)])>1 for c in n] for r in n];t+=1;0/(g!=h);g=h
print t
It raises an error if it isn't possible.
Try it online!