The Tamworth Two - USACO 2.4.1


thetamworthtwo - codetrick
A pair of cows is loose somewhere in the forest. Farmer John is lending his expertise to their capture. Your task is to model their behavior.
The chase takes place on a 10 by 10 planar grid. Squares can be empty or they can contain:
  • an obstacle,
  • the cows (who always travel together), or
  • Farmer John.
The cows and Farmer John can occupy the same square (when they `meet') but neither the cows nor Farmer John can share a square with an obstacle.
Each square is
represented
as follows:
  • . Empty square
  • * Obstacle
  • C Cows
  • F Farmer
Here is a sample grid:
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
The cows wander around the grid in a fixed way. Each minute, they either move forward or rotate. Normally, they move one square in the direction they are facing. If there is an obstacle in the way or they would leave the board by walking `forward', then they spend the entire minute rotating 90 degrees clockwise.
Farmer John, wise in the ways of cows, moves in exactly the same way.
The farmer and the cows can be considered to move simultaneously during each minute. If the farmer and the cows pass each other while moving, they are not considered to have met. The chase ends when Farmer John and the cows occupy the same square at the end of a minute.
Read a ten-line grid that represents the initial state of the cows, Farmer John, and obstacles. Each of the ten lines contains exactly ten characters using the coding above. There is guaranteed to be only one farmer and one pair of cows. The cows and Farmer John will not initially be on the same square.
Calculate the number of minutes until the cows and Farmer John meet. Assume both the cows and farmer begin the simulation facing in the `north' direction. Print 0 if they will never meet.

PROGRAM NAME: ttwo

INPUT FORMAT

Lines 1-10:Ten lines of ten characters each, as explained above

SAMPLE INPUT (file ttwo.in)

*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......

OUTPUT FORMAT

A single line with the integer number of minutes until Farmer John and the cows meet. Print 0 if they will never meet.

SAMPLE OUTPUT (file ttwo.out)

49
http://qingtangpaomian.iteye.com/blog/1635842
这道题目的直接模拟即可,有一个小问题在于程序何时停止:1.牛与农民相遇时停止,这种情况比较简单,当农民与牛的坐标相同即可。2.永远不可能相遇时停止,那么如何判断永远不可能相遇。我们使用一个状态数组记录牛、农民、以及他们运动的方向,如果当前牛、农民、以及他们运动的方向曾今出现在状态数组中,那么表示当前的这个状态之前出现过,也就是出现了循环,程序应当停止,并且输出0。
X.
http://qingtangpaomian.iteye.com/blog/1635842
http://sdjl.me/index.php/archives/103
    private static int fFacing = 0;//人的面向,0表示北,1表示东,2表示南,3表示西
    private static int cFacing = 0;//牛的面向,同上
    private static char[][] forestMap = new char[10][10];//森林地图
    private static int fX, fY, cX, cY;//人和牛的坐标
    private static int minutes = 0;//模拟运行的时间
    private static int answer;//输出的结果
    private static boolean[][][][][][] appeared = new boolean[10][10][4][10][10][4];//记录某种状态是否出现过,前3个参数分别是人的x坐标、y坐标、面向,而后3个参数是牛的
    public static void main(String[] args) throws IOException
    {
        init();
        run();
        output();
        System.exit(0);
    }
    private static void run()
    {
        //当人和牛没有遇见且此状态没有出现过
        while ((!meet()) && (stateNotAppeared()))
        {
            //模拟进入下一分钟
            enterNextMinute();
        }
        //如果他们见面了
        if (meet())
        {
            //输出所用时间
            answer = minutes;
        }
        else//否则没有见面
        {
            //输出0
            answer = 0;
        }
    }
    //进入下一分钟
    private static void enterNextMinute()
    {
        if (canMove(fX, fY, fFacing))
        {
            fMove();
        }
        else
        {
            fRotate();
        }
        if (canMove(cX, cY, cFacing))
        {
            cMove();
        }
        else
        {
            cRotate();
        }
        minutes++;
    }
    //根据坐标与面向判断能否前进
    private static boolean canMove(int x, int y, int facing)
    {
        boolean retCanMove = true;
        switch (facing)
        {
            case 0:
                if ((x == 0) || (forestMap[x - 1][y] == '*'))
                {
                    retCanMove = false;
                }
                break;
            case 1:
                if ((y == 9) || (forestMap[x][y + 1] == '*'))
                {
                    retCanMove = false;
                }
                break;
            case 2:
                if ((x == 9) || (forestMap[x + 1][y] == '*'))
                {
                    retCanMove = false;
                }
                break;
            case 3:
                if ((y == 0) || (forestMap[x][y - 1] == '*'))
                {
                    retCanMove = false;
                }
                break;
        }
        return retCanMove;
    }
    //人前进一步
    private static void fMove()
    {
        switch (fFacing)
        {
            case 0:
                fX--;
                break;
            case 1:
                fY++;
                break;
            case 2:
                fX++;
                break;
            case 3:
                fY--;
                break;
        }
    }
    //牛前进一步
    private static void cMove()
    {
        switch (cFacing)
        {
            case 0:
                cX--;
                break;
            case 1:
                cY++;
                break;
            case 2:
                cX++;
                break;
            case 3:
                cY--;
                break;
        }
    }
    //人旋转
    private static void fRotate()
    {
        fFacing = (fFacing + 1) % 4;
    }
    //牛旋转
    private static void cRotate()
    {
        cFacing = (cFacing + 1) % 4;
    }
    //判断是否相遇,相遇返回true
    private static boolean meet()
    {
        if ((fX == cX) && (fY == cY))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    //判断此状态是否出现过,没出现过返回true
    private static boolean stateNotAppeared()
    {
        if (appeared[fX][fY][fFacing][cX][cY][cFacing])
        {
            return false;
        }
        else
        {
            appeared[fX][fY][fFacing][cX][cY][cFacing] = true;
            return true;
        }
    }

http://www.cppblog.com/jericho/archive/2010/12/08/135786.html
http://martox.eu/2013/usaco-2-4-the-tamworth-two-cpp-solution/
const int MAX = 10000000;
int dx[] = -101,  0 };
int dy[] = {  010-1 };

int cd=0, cx, cy;
int fd=0, fx, fy;

int map[10][10];

int main(){
    
int i,j;
    
char ch;

    fin.open(
"ttwo.in");
    fout.open(
"ttwo.out");

    
for(i=0; i<10; i++)
        
for(j=0; j<10; j++){
            fin
>>ch;
            
if(ch=='*'){
                map[i][j]
=1;
            }
else if(ch=='C'){
                cx
=i, cy=j;
            }
else if(ch=='F'){
                fx
=i, fy=j;
            }

        }

       
    
int step=0;
    
int x,y;
    
while(step!=MAX){

        
// for cows
        x = cx+dx[cd];
        y 
= cy+dy[cd];
        
if(map[x][y]==1 || x<0 || x>9 || y<0 || y>9)
            cd 
= (cd+1)%4;
        
else{
            cx 
= x;
            cy 
= y;
        }


        
// for farmer
        x = fx+dx[fd];
        y 
= fy+dy[fd];
        
if(map[x][y]==1 || x<0 || x>9 || y<0 || y>9)
            fd 
= (fd+1)%4;
        
else{
            fx 
= x;
            fy 
= y;
        }


        step
++;

        
//compare
        if(cx==fx && cy==fy)
            
break;
    }


    
if(step == MAX)
        fout
<<0<<endl;
    
else
        fout
<<step<<endl;
    
return 0;
}


http://qingtangpaomian.iteye.com/blog/1635842
Read full article from thetamworthtwo - codetrick

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts