做題總結 Pawn s Revenge

2021-10-08 08:16:58 字數 1417 閱讀 7424

題目描述

這道題目自己一開始時也沒有思路(後來才發現其實也並不難,實在是學的不太好),後來從網上查詢了一些資料,大概明白了這道題目的思路。這道題目是在已經有且只有乙個k棋子的情況下,通過增加最少數量的的pawn棋子,能夠將對方的所有的*棋子全部攻擊到,其中k能夠攻擊其餘八個方向,pawn棋子只能攻擊左上角以及右上角兩個方向。

其實這道題目直接利用暴力列舉法進行解決。

首先,對所有的棋子構建乙個標記陣列,判斷已有k棋的其餘八個方向是否含有星棋,有的話則將那個星棋標記已訪問(這裡需要注意邊界條件)。

然後,開始從第一行第一列的棋子進行遍歷,如果該棋子是星棋並且未被訪問,則先判斷右下角的棋子是否是空,如果為空則可以放pawn棋子,將該星棋標記為已訪問,同時放下的pawn棋子的右上角的棋子無論是否是星棋,都將其標記為已訪問。如果右下角無法放pawn棋,再判斷左下角是否可以放下pawn棋,如若可以則將星棋標記為已訪問(這裡不需要再將放置的pawn棋的左上角的棋標記已訪問,因為左上角的棋一定比右上角的棋先進行遍歷判斷)。在這整個判斷的剁成中,一定要注意邊界條件的限制(一般來說這種有行有列、二維陣列的題目都需要注意邊界條件的限制),這一重點一定需要在**中體現出來,否則**也不會正確。

上面中為什麼先判斷右下角是否鞥放置星棋而不是左下角呢?個人感覺是因為遍歷判斷的時候是從做向右判斷的…

最後,再將整個棋盤遍歷一遍,檢視是否還有星棋。如果有的話則說明無法將對方的星棋全部攻擊,輸出-1;如果沒有的話輸出需要放置的星棋數量。

整個題目的接替思路大概就是如此,想到其實也不太容易(自己是這麼覺得的,還是因為水平不夠啊…),還有就是在**實現的時候,其實有許多需要注意的小細節一定要到位,細節決定成敗啊!

**實現(c++)

#include

using

namespace std;

int vis[

1020][

1020];

intmain()

for(i =

0; i < n; i++)}

}}}}

for(i =

0; i < n; i++)}

else

if(i +

1< n && j -

1>=

0&& a[i +1]

[j -1]

=='-')}

}}for(i =

0; i < n; i++)}

} cout << c << endl;

return0;

}

這個是暑假的第一篇做題總結,自己的學習還是有些鬆懈,時間安排不夠合理,今後必定要多做題、多總結,朝著演算法的方向前進,加油!!!

03 04做題總結

3 4 月做題總結 題目鏈結 主要思路 確定比賽名次 拓撲排序 奇怪的夢境 拓撲排序判環 逃生反向拓撲 儀仗隊o尤拉函式 秦隊長的猜想 g哥德 猜想 棋盤問題 dfs 回溯 非常可樂 bfs or 數論 表示式求值 m模擬legal or not t拓撲排序 產生冠軍 t拓撲排序 reward 拓撲...

做題總結 Latin Squares

原題 題意分析 題目就是輸入乙個二維陣列 用來表示矩陣 判斷對於矩陣中的每乙個數字是否在該數字所在的行 所在的列的只出現一次 相當於數獨的概念 如果是的話,則該矩陣是拉丁方,再判斷矩陣的第一行 第一列的元素是否按照公升序的方式排列的,從而進行對應的判斷輸出 做題思路 實現 include 萬能標頭檔...

10 12 做題總結

完成 cf 難度總和 2300 2300 2100 2100 2000 2000 900 2100 15800 2300 2300 2100 2100 2000 2000 900 2100 15800 2300 2 300 2100 210 0 20 00 2 000 900 2100 158 00...