I once experimented with an "interest-array" AI.
Each monster had a 2d integer array the same size as the level. The values represented the monsters interest in each cell.
If they noticed the player, a flood-fill centred on the player was made, starting with a high value for the player cell and decreasing with distance. The values from this flood fill was added to the monsters interest-array.
The monster checked which cell had the highest interest, and then moved in that direction using A* path-finding. All cells they saw were set to 0. Also, every turn each cell had their value increased by 1, to that the monsters would patrol the map a lot.
This had the nice effect that they would often do wrong guesses when they searched for the player, like here:
#########
#####...#
#######.#
#######.#
#######.#
##@.....#
##.####.#
#...###.#
#.M.###.#
#...#...#
#########
If the player reaches the junction before the monster sees him again, the monster will have to guess if it should go up or down.
I also tried making monsters "talk" to each other about finding the player, by combining the interest-arrays of monsters that met.