usaco The Tamworth Two 两只塔姆沃斯牛
生活随笔
收集整理的這篇文章主要介紹了
usaco The Tamworth Two 两只塔姆沃斯牛
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
兩只牛在森林里故意走丟了.農民 John 開始用他的專家技術追捕這兩頭牛.你的任務是模擬他們的
行為(牛和 John). 追擊在 10x10 的平面網格內進行.一個格子可以是: 一個障礙物, 兩頭牛(它們
總在一起), 或者農民 John.
兩頭牛和農民 John 可以在同一個格子內(當他們相遇時),但是他們都不能進入有障礙的格子.
一個格子可以是:
. 空地 * 障礙物 C 兩頭牛 F 農民 John
這里有一個地圖的例子::
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
牛在地圖里以固定的方式游蕩.每分鐘,它們可以向前移動或是轉彎.如果前方無障礙且不會離開地
圖,它們會按照原來的方向前進一步.否則它們會用這一分鐘順時針轉 90 度.
農民 John, 深知牛的移動方法,他也這么移動.
每次(每分鐘)農民 John 和兩頭牛的移動是同時的.如果他們在移動的時候穿過對方,但是沒有在同
一格相遇,我們不認為他們相遇了.當他們在某分鐘末在某格子相遇,那么追捕結束.開始時,John
和牛都面向北方.
PROGRAM NAME: ttwo
INPUT FORMAT
Lines 1-10:
每行 10 個字符,表示如上文描述的地圖.
SAMPLE INPUT (file ttwo.in)
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
OUTPUT FORMAT
輸出一個數字,表示 John 需要多少時間才能抓住牛們.輸出 0,如果 John 無法抓住牛.
32
SAMPLE OUTPUT (file ttwo.out)
行為(牛和 John). 追擊在 10x10 的平面網格內進行.一個格子可以是: 一個障礙物, 兩頭牛(它們
總在一起), 或者農民 John.
兩頭牛和農民 John 可以在同一個格子內(當他們相遇時),但是他們都不能進入有障礙的格子.
一個格子可以是:
. 空地 * 障礙物 C 兩頭牛 F 農民 John
這里有一個地圖的例子::
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
牛在地圖里以固定的方式游蕩.每分鐘,它們可以向前移動或是轉彎.如果前方無障礙且不會離開地
圖,它們會按照原來的方向前進一步.否則它們會用這一分鐘順時針轉 90 度.
農民 John, 深知牛的移動方法,他也這么移動.
每次(每分鐘)農民 John 和兩頭牛的移動是同時的.如果他們在移動的時候穿過對方,但是沒有在同
一格相遇,我們不認為他們相遇了.當他們在某分鐘末在某格子相遇,那么追捕結束.開始時,John
和牛都面向北方.
PROGRAM NAME: ttwo
INPUT FORMAT
Lines 1-10:
每行 10 個字符,表示如上文描述的地圖.
SAMPLE INPUT (file ttwo.in)
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
OUTPUT FORMAT
輸出一個數字,表示 John 需要多少時間才能抓住牛們.輸出 0,如果 John 無法抓住牛.
32
SAMPLE OUTPUT (file ttwo.out)
49
一開始我想的是bfs,一般求最短時間啥的不都是用bfs的嗎,但是這題我發現不通,數據很小可以大模擬,搞事情反正我有不怕大新聞。v1數組記錄的是人到達那點的方向v2是牛的,如果它兩又同時到達某兩點,而且和之前的方向一樣那就循環了,return 0即可。可是第一次提交的時候提醒我編譯錯誤。
可是在編譯器里面正常運行啊,然后我就想到之前有次用map當數組時和頭文件里面的map函數沖突,然后我改了頭文件果然通過了。看來<bits/stdc++.h>用起來方便可還是要注意啊。代碼可以再變短一點因為F和C的前進規則一樣可以用函數代替不用像我這樣把人和牛的步驟都寫出來。
/*
ID: jinbo wu
TASK: ttwo
LANG:C++
*/
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int d[4][2]={-1,0,0,1,1,0,0,-1};
int v1[15][15];
int v2[15][15];
char a[15][15];
int x1,x2,y1,y2;
struct pos
{int x,y,dir;
};
queue<pos> q1,q2;
int bfs()
{memset(v1,-1,sizeof(v1));memset(v2,-1,sizeof(v2));pos p1,p2;int dx,dy;p1.x=x1,p1.y=y1,p1.dir=0;q1.push(p1);p2.x=x2,p2.y=y2,p2.dir=0;q2.push(p2);int t=0;while(1){p1=q1.front();q1.pop();p2=q2.front();q2.pop();if(p1.x==p2.x&&p1.y==p2.y)return t;if(v1[p1.x][p1.y]==p1.dir&&v2[p2.x][p2.y]==p2.dir)return 0;v1[p1.x][p1.y]=p1.dir,v2[p2.x][p2.y]=p2.dir;dx=p1.x+d[p1.dir][0];dy=p1.y+d[p1.dir][1];if(a[dx][dy]=='*'||dx<1||dx>10||dy<1||dy>10){p1.dir=(p1.dir+1)%4;q1.push(p1);}else {p1.x=dx,p1.y=dy;q1.push(p1);}dx=p2.x+d[p2.dir][0];dy=p2.y+d[p2.dir][1];if(a[dx][dy]=='*'||dx<1||dx>10||dy<1||dy>10){p2.dir=(p2.dir+1)%4;q2.push(p2);}else{p2.x=dx,p2.y=dy;q2.push(p2);}t++;}}
int main()
{freopen("ttwo.in","r",stdin);freopen("ttwo.out","w",stdout);for(int i=1;i<=10;i++)for(int j=1;j<=10;j++){cin>>a[i][j];if(a[i][j]=='F'){x1=i,y1=j;}if(a[i][j]=='C'){x2=i,y2=j;}}int ans=bfs();cout<<ans<<endl;}
總結
以上是生活随笔為你收集整理的usaco The Tamworth Two 两只塔姆沃斯牛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吧开头的成语有哪些?
- 下一篇: usaco Overfencing 穿越