USACO The Tamworth Two 模拟

一道模拟题不过要担心的是牛或者人在转弯的时候,另一方如果能走,那么要走,不能停留。

还是蛮简单的。

 

调试输出的话可以看到具体追击过程

Source Code:

/*

ID: wushuai2

PROG: ttwo

LANG: C++

*/

//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler

#include <stdio.h>

#include <iostream>

#include <fstream>

#include <cstring>

#include <cmath>

#include <stack>

#include <string>

#include <map>

#include <set>

#include <list>

#include <queue>

#include <vector>

#include <algorithm>

#define Max(a,b) (((a) > (b)) ? (a) : (b))

#define Min(a,b) (((a) < (b)) ? (a) : (b))

#define Abs(x) (((x) > 0) ? (x) : (-(x)))

#define MOD 1000000007

#define pi acos(-1.0)

#define RV(num) ((num) > 0 ? 0 : 1)



using namespace std;



typedef long long           ll      ;

typedef unsigned long long  ull     ;

typedef unsigned int        uint    ;

typedef unsigned char       uchar   ;



template<class T> inline void checkmin(T &a,T b){if(a>b) a=b;}

template<class T> inline void checkmax(T &a,T b){if(a<b) a=b;}



const double eps = 1e-7      ;

const int M = 660000         ;

const ll P = 10000000097ll   ;

const int INF = 0x3f3f3f3f   ;

const int MAX_N = 20         ;

const int MAXSIZE = 101000000;



ofstream fout ("ttwo.out");

ifstream fin ("ttwo.in");



int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

char gra[11][11];

int dir_f, dir_c;



struct sc{

    int x, y;

}pos[2], nxt_pos[2], sta[2];



bool check(int x, int y){

    if(x >= 1 && x <= 10 && y >= 1 && y <= 10){

        if(gra[x][y] != '*'){

            return true;

        }

    }

    return false;

}



bool finish(){

    if(pos[0].x == pos[1].x && pos[1].y == pos[0].y){

        return true;

    } else  return false;

}



int main(){

    int i, j, k, l, m, n, t, s, c, w, q, u, v, num, val;

    for(i = 1; i <= 10; ++i){

        for(j = 1; j <= 10; ++j){

            fin >> gra[i][j];

            if(gra[i][j] == 'F'){

                sta[0].x = i, sta[0].y = j;

                //pos[0].x = i, pos[0].y = j;

            } else if(gra[i][j] == 'C'){

                sta[1].x = i, sta[1].y = j;

                //pos[1].x = i, pos[1].y = j;

            }

        }

    }

    int ans = 1;

    int dir_f = 0;

    int dir_c = 0;

    pos[0] = sta[0], pos[1] = sta[1];

    for(;;){

        /*

        for(i = 1; i <= 10; ++i){

            for(j = 1; j <= 10; ++j){

                if(pos[0].x == i && pos[0].y == j){

                    fout << 'F';

                } else if(pos[1].x == i && pos[1].y == j){

                    fout << 'C';

                } else if(gra[i][j] == '*') fout << '*';

                else    fout << '.';

            }

            fout << endl;

        }

        fout << endl;

        */

        nxt_pos[0].x = pos[0].x + dir[dir_f][0];

        nxt_pos[0].y = pos[0].y + dir[dir_f][1];

        nxt_pos[1].x = pos[1].x + dir[dir_c][0];

        nxt_pos[1].y = pos[1].y + dir[dir_c][1];

        if(check(nxt_pos[0].x, nxt_pos[0].y) && check(nxt_pos[1].x, nxt_pos[1].y)){

            pos[0] = nxt_pos[0], pos[1] = nxt_pos[1];

        } else if(!check(nxt_pos[0].x, nxt_pos[0].y) && !check(nxt_pos[1].x, nxt_pos[1].y)){

            dir_f = (dir_f + 1) % 4;

            dir_c = (dir_c + 1) % 4;

        } else if(check(nxt_pos[0].x, nxt_pos[0].y) && !check(nxt_pos[1].x, nxt_pos[1].y)){

            dir_c = (dir_c + 1) % 4;

            pos[0] = nxt_pos[0];

        } else if(!check(nxt_pos[0].x, nxt_pos[0].y) && check(nxt_pos[1].x, nxt_pos[1].y)){

            dir_f = (dir_f + 1) % 4;

            pos[1] = nxt_pos[1];

        }

        if(finish()){

            break;

        }

        ++ans;

        if(ans > 10000){

            ans = 0;

            break;

        }

    }



    fout << ans << endl;

    fin.close();

    fout.close();

    return 0;

}

 

你可能感兴趣的:(USACO)