Problem:
ぴょん吉の夏

会津大学には一面芝生で覆われた公園があり、日差しを遮る木や建物がありません。日差しの強い夏の日には、公園内に設置されたスプリンクラーが作動して芝生に散水しています。この公園にはカエルのぴょん吉が住み着いています。ぴょん吉は暑いのが苦手で、日差しが強い夏の日には常にスプリンクラーの水に当たっていないと干からびて死んでしまいます。公園に設置されたスプリンクラーは、節水のため一度に一つだけ散水することになっているので、ぴょん吉はスプリンクラーの作動に合わせて移動しなくてはなりません。

(a) 公園の地図

(b) ぴょん吉のジャンプ範囲

(c) スプリンクラーの散水範囲

公園は上図の(a)のとおりで、公園内の場所は縦横それぞれ 0~9 の座標で表し、黒い●がスプリンクラーで、その番号が作動する順番を表しています。これは一例で各スプリンクラーの場所と作動順序は日々変わります。

ぴょん吉は不器用なので、移動するにも決まった距離をジャンプすることしかできません。ぴょん吉のジャンプできる範囲は上図(b)のとおりで、それ以外の場所に移動することはできません。しかも、一回のジャンプで相当体力を消耗するため、しばらく水に当たって休まなくてはなりません。

スプリンクラーが散水できる範囲は上図(c)のとおりで、スプリンクラー自身の座標も含みます。各スプリンクラーは一定時間散水すると停止し、すぐに次のスプリンクラーが作動を開始します。ぴょん吉はこの時に一回だけジャンプするものとし、次に散水が停止するまでジャンプしないものとします。また、公園の四方は灼熱のアスファルトで囲まれているので公園の外にでてしまうような方向にはジャンプしないものとします。

猛暑となったこの夏。果たしてぴょん吉は生き延びることができたのでしょうか? ある日のぴょん吉の初期位置、スプリンクラーの位置と作動順序を読み込み、ぴょん吉が生き延びられる移動経路が存在している場合は”OK”、どう頑張っても死んでしまう場合は”NA”を出力するプログラムを作成してください。ただし、スプリンクラーの数は最大 10 個とし、ぴょん吉は一番目のスプリンクラーの作動と同時に初期位置からジャンプすることとします。

Input

複数のデータセットが与えられます。各データセットは以下の形式で与えられます。

px py
n
x1 y1 x2 y2 ... xn yn

1 行目にぴょん吉の初期位置の横座標 px と縦座標 py が与えられます。
2 行目にスプリンクラーの数 n が与えられます。
3 行目に i 番目に動作するスプリンクラーの横座標 xi と縦座標 yi が与えられます。

入力はゼロ２つの行で終わります。データセットの数は 20 を超えません。

Output

各データセットについて、生存の場合は OK、そうでない場合は NA を１行に出力してください。

Sample Input

6 1
10
6 4 3 3 1 2 0 5 4 6 1 8 5 9 7 7 8 6 8 3
6 1
10
6 4 3 3 1 2 0 5 4 6 1 8 5 9 7 7 8 6 9 0
0 0

Output for the Sample Input

OK
NA

Solution in JavaScript (judge verdict: Accepted)

'use strict';
var AOJ = {};
(function(ns) {
    var isBrowser = function() {
        return typeof window !== 'undefined';
    }
    ns.isBrowser = isBrowser;
    
    var isNodejs = function() {
        return ! isBrowser();
    }
    ns.isNodejs = isNodejs;
    
    if (isBrowser()) {
        var getHtmlEncoded = function(string0) {
            return String(string0)
                    .replace(/&/g, '&amp;')
                    .replace(/"/g, '&quot;')
                    .replace(/'/g, '&#39;')
                    .replace(/</g, '&lt;')
                    .replace(/>/g, '&gt;');
        }
        ns.getHtmlEncoded = getHtmlEncoded;
        
        var outputCode = function(function0) {
            document.getElementById('code').innerHTML = '<pre><code>' + getHtmlEncoded(function0) + '</code></pre>';
        }
        ns.outputCode = outputCode;
    }
    
    var getInput = function() {
        var inputLines = [];
        if (isBrowser()) {
            var html = document.getElementById('input').innerHTML;
            inputLines = html.split('<br>');
            for (var i = 0; i < inputLines.length; i++) {
                inputLines[i] = inputLines[i].trim();
            }
        }
        if (isNodejs()) {
            inputLines = require('fs').readFileSync('/dev/stdin', 'utf8').trim().split('\n');
        }
        return inputLines;
    }
    ns.getInput = getInput;
    
    var setLineReader = function(callback) {
        if (isBrowser()) {
            var lines = getInput();
            for (var i = 0; i < lines.length; i++) {
                callback(lines[i]);
            }
        }
        if (isNodejs()) {
            var readStream = require('fs').ReadStream('/dev/stdin');
            var readlineInterface = require('readline').createInterface({'input': readStream, 'output': {}});
            readlineInterface.on('line', function(line) {
                callback(line);
            });
        }
    }
    ns.setLineReader = setLineReader;
    
    var doOutput = function(outputLines) {
        if (isBrowser()) {
            document.getElementById('output').innerHTML = outputLines.map(getHtmlEncoded).join('<br>\n');
        }
        if (isNodejs()) {
            for (var i = 0; i < outputLines.length; i++) {
                console.log(outputLines[i]);
            }
        }
    }
    ns.doOutput = doOutput;
    
    var outputLines = []
    var doOutputLine = function(outputLine) {
        if (isBrowser()) {
            outputLines.push(outputLine);
            document.getElementById('output').innerHTML = outputLines.map(getHtmlEncoded).join('<br>\n');
        }
        if (isNodejs()) {
            console.log(outputLine);
        }
    }
    ns.doOutputLine = doOutputLine;
    
    var doMain = function(main) {
        if (isBrowser()) {
            window.onload = function() {
                outputCode(main);
                main();
            }
        }
        if (isNodejs()) {
            main();
        }
    }
    ns.doMain = doMain;
})(AOJ);

var main = function() {
    var fieldX = 0;
    var fieldY = 0;
    var fieldWidth = 10;
    var fieldHeight = 10;
    var phyonkichiMoves = [
        [-1, -2], [0, -2], [1, -2],
        [-2, -1], [2, -1],
        [-2, 0], [2, 0],
        [-2, 1], [2, 1],
        [-1, 2], [0, 2], [1, 2]
    ];
    var splinklerMoves = [
        [-1, -1], [0, -1], [1, -1],
        [-1, 0], [0, 0], [1, 0],
        [-1, 1], [0, 1], [1, 1]
    ];
    var dataTypes = {};
    dataTypes.phyonkichiLocation = 0;
    dataTypes.numSprinklers = 1;
    dataTypes.splinklerLocations = 2;
    var input;
    var lineCount = 0;
    var isLocationInField = function(x, y) {
        if (fieldX <= x && x < fieldWidth) {
            if (fieldY <= y && y < fieldHeight) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    var getMovedLocations = function(location, moves) {
        var movedLocations = [];
        for (var i = 0; i < moves.length; i++) {
            var move = moves[i];
            var x = location[0] + move[0];
            var y = location[1] + move[1];
            if (isLocationInField(x, y)) {
                movedLocations.push([x, y]);
            }
        }
        return movedLocations;
    }
    var getNextPhyonkichiLocations = function(phyonkichiLocation) {
        return getMovedLocations(phyonkichiLocation, phyonkichiMoves);
    }
    var getWetLocations = function(splinklerLocation) {
        return getMovedLocations(splinklerLocation, splinklerMoves);
    }
    var cache;
    var stack;
    var callCount;
    var canSurvive = function(phyonkichiLocation, splinklerLocations) {
        callCount++;
        var cacheKey = splinklerLocations.length + ', ' + phyonkichiLocation[0] + ', ' + phyonkichiLocation[1];
        if (cacheKey in cache) {
            return cache[cacheKey];
        }
        stack.push(phyonkichiLocation);
        if (splinklerLocations.length <= 0) {
//            console.log('Stack: ' + JSON.stringify(stack));
            return true;
        }
        var splinklerLocation = splinklerLocations[0];
        var nextPhyonkichiLocations = getNextPhyonkichiLocations(phyonkichiLocation);
        var wetLocations = getWetLocations(splinklerLocation);
        for (var i = 0; i < nextPhyonkichiLocations.length; i++) {
            var nextPhyonkichiLocation = nextPhyonkichiLocations[i];
            for (var j = 0; j < wetLocations.length; j++) {
                var wetLocation = wetLocations[j];
                if (nextPhyonkichiLocation[0] === wetLocation[0] &&
                    nextPhyonkichiLocation[1] === wetLocation[1]) {
                    var nextSplinklerLocations = splinklerLocations.slice(1);
                    var can = canSurvive(nextPhyonkichiLocation, nextSplinklerLocations);
                    if (can) {
                        return true;
                    }
                }
            }
        }
        stack.splice(stack.length - 1, 1);
        cache[cacheKey] = false;
        return false;
    }
    var handleLine = function(line) {
        var args = line.split(' ');
        for (var i = 0; i < args.length; i++) {
            args[i] = parseFloat(args[i]);
        }
        var dataType = lineCount % Object.keys(dataTypes).length;
        if (dataType === dataTypes.phyonkichiLocation) {
            input = {};
            input.phyonkichi = {};
            input.splinklerLocations = [];
            input.phyonkichi.x = args[0];
            input.phyonkichi.y = args[1];
            if (input.phyonkichi.x === 0 && input.phyonkichi.y === 0) {
//                console.log('end');
            }
        } else if (dataType === dataTypes.numSprinklers) {
            input.numSprinklers = args[0];
        } else if (dataType === dataTypes.splinklerLocations) {
            for (var i = 0; i < args.length; i += 2) {
                input.splinklerLocations.push([args[i], args[i + 1]]);
            }
//            console.log(JSON.stringify(input));
            callCount = 0;
            cache = {};
            stack = [];
            if (canSurvive([input.phyonkichi.x, input.phyonkichi.y], input.splinklerLocations)) {
                AOJ.doOutputLine('OK');
            } else {
                AOJ.doOutputLine('NA');
            }
//            console.log('callCount: ' + callCount);
        } else {
            
        }
        lineCount++;
    }
    AOJ.setLineReader(handleLine);
}

AOJ.doMain(main);