洛谷 P1101 題解

2021-08-20 12:04:05 字數 1867 閱讀 4482

這道題可以用深搜(回溯)來寫,相信大部分人都是這麼想的,但是有些人可能在一些地方饒了半天,所以這裡就貼一下我的思路,個人覺得自己的很好懂,除了tx和ty那裡,但是tx和ty的那種用法對於輸出路徑的題目一般很實用

這個算是比較簡單的吧,題目裡給出了具體要找的字串,我們要做的就是對它進行8個方向的搜尋,所以先定乙個方向,和要找的字串

(注,**前的span...>都不是**!!)

const char key[8]=;
int dirx[8]=,diry[8]=;
配合著x,y分別是左上,正上,右上,正左,正右,左下,正下和右下

然而最後我們並不是只要是這些關鍵字就要保留的,所以我們只需記錄下我們最後需要輸出的座標

int used[105][105];
但是並不是每乙個都需要去搜尋的,只要在需要搜尋的地方搜尋就可以了

那麼哪些需要搜尋呢,最開始肯定是從字元'y'開始往裡搜尋啦,然後在開始搜尋之前呢,先判斷我們下一步往哪個方向進行搜尋,這樣就不需要每次都各個方向的去找了(廢話)

那麼就先做個函式對找到的'y'進行確定下一步往哪個方向去找

void start (int x,int y)//最開始找到的'y'的座標

}}

接下來是深搜的函式

void dfs (int x,int y,int rank,int fx)//x,y是當前座標,rank則是記錄現在已經找到幾個了,fx表示方向

//這一步後面會解釋,其實是全部找到了就對一路走過來的這幾個打上'標記'意味著需要保留

int kx,ky;

kx=x+dirx[fx];ky=y+diry[fx];//臨時變數

if (kx<0||ky<0||kx>=n||ky>=n)//防止越界

return;

if (s[kx][ky]==key[rank+1])

}

之後就是我們的deal函式了,deal是對一直能夠走到這條路的所有座標進行處理讓他們可以保留原樣輸出(used[x][y]=1)

void deal (int x,int y)

}

最後順便帶了個輸出函式

void print (void)

;char s[105][105];

int n,dirx[8]=,diry[8]=,tx[105],ty[105],used[105][105],locx,locy;

void deal (int x,int y)

}void dfs (int x,int y,int rank,int fx)//x,y是當前座標,rank則是記錄現在已經找到幾個了,fx表示方向

//這一步後面會解釋,其實是全部找到了就對一路走過來的這幾個打上'標記'意味著需要保留

int kx,ky;

kx=x+dirx[fx];ky=y+diry[fx];//臨時變數

if (kx<0||ky<0||kx>=n||ky>=n)//防止越界

return;

if (s[kx][ky]==key[rank+1])

}void start (int x,int y)//最開始找到的'y'的座標

}}void print (void)

{    for (int i=0;i>n;//輸入n

memset(tx,-1,sizeof(tx));//將每個路徑都記為-1

memset(ty,-1,sizeof(ty));

for (int i=0;i>s[i][j];

for (int i=0;i

洛谷P1101單詞方陣

整體的思路 在矩陣中找到 y 然後對 y 進行八個方向的搜尋 用cmp陣列存 yizhong 在每乙個方向中和cmp進行比較,若存在任意乙個不同,則處理下乙個方向。include includeusing namespace std const int dx 方向陣列 const int dy co...

單向DFS 洛谷P1101

這題跟以往的dfs不同的是,它是單向的dfs 因為我做題少,所以第一次見到這種型別的題目 思路很簡單,但是對於第一次做這種單向dfs的我來說 我蒻 開始確實感覺無從下手。這道題目和以往的dfs不同的地方在於,dfs的方向是在外面判斷的,然後還要記錄路徑,路徑記錄全了才能往vis裡面加true。直接看...

洛谷 P1101 單詞方陣

題目描述 給一nxn的字母方陣,內可能蘊含多個 yizhong 單詞。單詞在方陣中是沿著同一方向連續擺放的。擺放可沿著8個方向的任一方向,同一單詞擺放時不再改變方向,單詞與單詞之間 color red 可以 color 交叉,因此有可能共用字母。輸出時,將不是單詞的字母用 代替,以突出顯示單詞。例如...