貓捉老鼠
| Time Limit:1s |
Memory limit:32M |
| Accepted Submit:470 |
Total Submit:1487 |
一隻貓和一隻老鼠在10*10的迷宮中。迷宮中的每個方格可以是空的,或者含有障礙。貓和老鼠可以進入任意一個空的方格中。當他們相遇時,貓和老鼠在同一個方格中。但是,無論貓或老鼠都不能進入有障礙的方格。我們可以用字元組成的二維數組表示迷宮,如所示。 老鼠在迷宮中按照一種固定的方式行走:每個時刻,老鼠都向它所面對的方向前進一格,這需要花費1秒時間。如果前方是一個障礙或者是迷宮的邊界,它將花1秒的時間按順時針方向轉90度。 為了抓到老鼠,這隻貓決定也按照與老鼠相同的行走方式行進。 貓和老鼠在每個單位時間內是同時行動的。因此,如果貓和老鼠在行進過程中“擦肩而過”,貓是無法捉到老鼠的。只有當貓和老鼠同時到達一個相同的格子時,貓才能捉住老鼠。 初始時,貓和老鼠不會在同一個方格中。並且它們都面向北方。 你的任務是編一個程式,求出貓捉到老鼠的所花時間。 輸入輸出格式 輸入資料的第一行n,表示輸入資料的組數。 每組資料由10行組成,每行10個字元,表示迷宮的地圖以及貓和老鼠的初始位置。輸入資料保證只有一隻貓和一隻老鼠。 每組輸入資料之後均有一個空行作為間隔。 對於每組給定的輸入,輸出一行僅含一個數,即貓捉到老鼠所花的時間。如果貓永遠都無法抓到老鼠,則輸出0。 範例輸入 1*...*...........*......*...*...............*.c....*.....*......*........m......*...*.*.....*.*...... 範例輸出 49 |
解題:
類比走的過程。先要取貓和老鼠的座標,然後類比兩隻動物一起行走的過程。在過程中,要對方向進行判別,東西南北可以用3210代替。判定永遠無法捉到老鼠的時候,可以設定一個較大的值,超過這個值,將無法捉到老鼠。這個要自己琢磨。
#include <iostream><br />using namespace std;<br />#define length 10<br />#define width 10<br />typedef struct<br />{<br />int x;<br />int y;<br />}Point;</p><p>void animalWhere(char map[][width],Point &mouse,Point &cat)<br />{<br />int i,j;<br />for (i=0;i<length;i++)<br />{<br />for (j=0;j<width;j++)<br />{<br />if (map[i][j]=='c')<br />{<br />cat.x=i;<br />cat.y=j;<br />map[i][j]='.';<br />continue;<br />}<br />if (map[i][j]=='m')<br />{<br />mouse.x=i;<br />mouse.y=j;<br />map[i][j]='.';<br />continue;<br />}<br />}<br />}<br />}</p><p>Point move(char map[][width],Point &animal,int &way)<br />{<br />if (way==0)<br />{<br />if (animal.x!=0 && map[animal.x-1][animal.y]!='*' )<br />{<br />animal.x--;<br />return animal;<br />}<br />if (animal.x==0 || map[animal.x-1][animal.y]=='*')<br />{<br />way=1;<br />return animal;<br />}<br />}<br />if (way==1)<br />{<br />if (animal.y!=width-1 && map[animal.x][animal.y+1]!='*' )<br />{<br />animal.y++;<br />return animal;<br />}<br />if (animal.y==width-1 || map[animal.x][animal.y+1]=='*')<br />{<br />way=2;<br />return animal;<br />}<br />}<br />if (way==2)<br />{<br />if (animal.x!=length-1 && map[animal.x+1][animal.y]!='*' )<br />{<br />animal.x++;<br />return animal;<br />}<br />if (animal.x==length-1 || map[animal.x+1][animal.y]=='*')<br />{<br />way=3;<br />return animal;<br />}<br />}<br />if (way==3)<br />{<br />if (animal.y!=0 && map[animal.x][animal.y-1]!='*' )<br />{<br />animal.y--;<br />return animal;<br />}<br />if (animal.y==0 || map[animal.x][animal.y-1]=='*')<br />{<br />way=0;<br />return animal;<br />}<br />}<br />}</p><p>int main()<br />{<br />int i,n,mouseWay,catWay,time;<br />Point mouse,cat;<br />char map[length][width];<br />cin>>n;<br />while (n--)<br />{<br />mouseWay=0;catWay=0;time=0;<br />memset(map,'/0',sizeof(map));<br />cin.ignore();<br />for (i=0;i<length;i++)<br />{<br />cin.getline(map[i],width+1);<br />}<br />animalWhere(map,mouse,cat);<br />while (1)<br />{<br />mouse=move(map,mouse,mouseWay);<br />cat=move(map,cat,catWay);<br />time++;<br />if (mouse.x==cat.x && mouse.y==cat.y)<br />{<br />break;<br />}<br />if (time>10000)<br />{<br />time=0;<br />break;<br />}<br />}<br />cout<<time<<endl;<br />}<br />return 0;<br />}