水題其實也能反映思維的嚴謹性:USACO The Tamworth Two

簡單的模擬。

需要記錄方向和座標,進行模擬,直到相遇。如何判斷永遠不相遇呢?

可以用bool數組保存已經訪問過的位置信息。

但是一開始我糊塗了,暈透了我,靠。一開始我都沒往下細想就用了兩個3維數組來存儲,前面幾組數據都對,唯獨到了第4組數據我的程序輸出爲0,調試最怕的就是很多數據都對,就一些數據不對,這裏還是可以看出USACO的測試數據還是很有水平的,顧及了很多細節和容易掉鏈子的地方。

兩個三維數組之間沒有相互制約性,不能保證農民和奶牛是同時——注意同時——訪問了某兩個點。

改完後那是天朗氣清惠風和暢。

時間和空間都不錯。

PS. 我感覺是不是可以用數學的方法來解決呢?因爲農民與奶牛各自最終運動路線爲一循環,問題是算是這個循環週期的問題。不過也要用模擬的辦法才能算出來吧,不知道先算出週期再用最小公倍數的辦法去做值不值?



/*
ID: fairyroad
TASK:ttwo
LANG:C++
*/
#include<fstream>
using namespace std;
ifstream fin("ttwo.in");
ofstream fout("ttwo.out");

char map[10][10];
bool visited[10][10][4][10][10][4]; // farmer status/cow status
struct pos{ int x, y, dir;};
inline bool check(const pos& pa, const pos& pb) {
    return pa.x == pb.x && pa.y == pb.y;
}
inline void move(pos& p)
{
    switch(p.dir)
    {
        case 0:
            if(p.x-1 < 0 || map[p.x-1][p.y] == '*'){ p.dir = 1; return; }
            else{ --p.x; return; }
        case 1:
            if(p.y+1 >= 10 || map[p.x][p.y+1] == '*'){ p.dir = 2; return;}
            else{++p.y; return;}
        case 2:
            if(p.x+1 >= 10 || map[p.x+1][p.y] == '*'){ p.dir = 3; return;}
            else{++p.x; return;}
        case 3:
            if(p.y-1 < 0 || map[p.x][p.y-1] == '*'){ p.dir = 0; return;}
            else{--p.y; return;}
        default:
            return;
    }
}

int main()
{
    int i, j, res = 0;
    pos p1, p2;
    for(i = 0; i < 10; ++i)
    {
        for(j = 0; j < 10; ++j)
        {
            fin>>map[i][j];
            if(map[i][j] == 'F') {p1.x = i; p1.y = j; p1.dir = 0;}
            else if(map[i][j] == 'C') {p2.x = i; p2.y = j; p2.dir = 0; }
        }
    }
    visited[p1.x][p1.y][p1.dir][p2.x][p2.y][p2.dir] = true;
    while(true)
    {
        ++res;
        move(p1); move(p2);
        if(visited[p1.x][p1.y][p1.dir][p2.x][p2.y][p2.dir]) {fout<<0<<endl; return 0; }
        visited[p1.x][p1.y][p1.dir][p2.x][p2.y][p2.dir] = true;
        if(check(p1, p2)) { fout<<res<<endl; return 0;}
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章