簡單的模擬。
需要記錄方向和座標,進行模擬,直到相遇。如何判斷永遠不相遇呢?
可以用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;}
}
}