n.circle = 20; n.sharp = 20; size = 10
loc = sample(1:size^2, n.circle+n.sharp)
type = c(rep(1,n.circle),rep(2,n.sharp))
# circle = 1; sharp = 2
people = cbind(type,loc)
state.mat = matrix(0,size,size)
state.mat[people[,2]]=people[,1]
p.move = #1/(2*n.circle)
p.other = 0.1
c.count = 3
idx = cbind(rep(1:size,size),sort(rep(1:size,size)))
#
term = F
while (term == F){
term = T
rand.order = sample(1:nrow(people))
for (i.p in 1:nrow(people)){
if (people[rand.order[i.p],1]==1){
# circle
if (runif(1) < p.move){
empty = 1:(size^2)
empty = empty[-sort(people[,2])]
people[rand.order[i.p],2] = sample(empty,1)
state.mat = matrix(0,size,size)
state.mat[people[,2]]=people[,1]
term = F
}
} else {
# sharp
x.min = max(idx[people[rand.order[i.p],2],1]-1,1)
x.max = min(idx[people[rand.order[i.p],2],1]+1,size)
y.min = max(idx[people[rand.order[i.p],2],2]-1,1)
y.max = min(idx[people[rand.order[i.p],2],2]+1,size)
circle.in = sum(state.mat[x.min:x.max,y.min:y.max]==1)
if (circle.in >= c.count){
empty = 1:(size^2)
empty = empty[-sort(people[,2])]
people[rand.order[i.p],2] = sample(empty,1)
state.mat = matrix(0,size,size)
state.mat[people[,2]]=people[,1]
term = F
#print('moved')
}
}
}
for (i.p in 1:nrow(people)){
if (people[rand.order[i.p],1]==2){
x.min = max(idx[people[i.p,2],1]-1,1)
x.max = min(idx[people[i.p,2],1]+1,size)
y.min = max(idx[people[i.p,2],2]-1,1)
y.max = min(idx[people[i.p,2],2]+1,size)
circle.in = sum(state.mat[x.min:x.max,y.min:y.max]==1)
print(circle.in)
if (circle.in >= c.count){
term = F
break
}
}
}
}
plot(0,0, type= 'n', xlim = c(0,11),ylim=c(0,11))
lab = c("0","#")
text(idx[people[,2],1],idx[people[,2],2],lab[people[,1]],cex=3)
ab = seq(0.5,10.5,1)
for (i in 1:11){
abline(h=ab[i],col='red')
abline(v=ab[i],col='red')
}

*Related*