m皇后(思路題目)

2021-08-17 03:46:39 字數 1723 閱讀 1731

這道題當初有兩點沒有想到,一點是不知道該如何處理斜著的方向,另一點是沒想到只用求該直線上的兩端點。

這題要開四個陣列,分別記錄該方向上的點的最左端和最右端。

然後遍歷所有的點,遍歷該點的四個方向(上下是乙個方向,左右是乙個方向,斜向上乙個,斜向下乙個),如果該方向上只有乙個點,就不存在威脅,如果該點在最右端或者最左端,在該方向上就有乙個威脅,否則該點在中間,就有兩個威脅。然後記錄該點有幾個威脅。

忘了一點,如何判斷斜方向的範圍:

斜方向的斜率都是1或者-1,所以都滿足y=x+b(或者y=-x+b),這樣同一斜線上的y-x(或者y+x)的值是固定的,b就是判斷條件,只需注意y-x為負數的時候就行了。

思想:

記錄四個方向的點的分布範圍(左右最值);

遍歷每個點判斷每個點的威脅個數。

**:

#include

#include

#include

using

namespace

std;

const

int maxn=100009;

int xx[maxn][2];//以行為直線,縱座標的分布,xx[0]為最小值,xx[1]為最大值,

int yy[maxn][2];//以列為直線,橫座標的分布,

int yx[maxn*2][2];//y=-x+b的直線的點的分布,

int y_x[maxn][4];//y=x+b的直線的點的分布,0,1記錄y-x為正的最小值和最大值,2,3記錄y-x為負的最小值和最大值

int ans[10];//ans[i]記錄i個威脅的點的個數

int a[maxn],b[maxn];//記錄橫縱座標

int main()

if(yy[y][0]==0)//以列為直線

yy[y][0]=yy[y][1]=x;

else

int f1=y+x;

int f2=y-x;

if(yx[f1][0]==0)//以y=-x+b為直線

yx[f1][0]=yx[f1][1]=y;

else

if(f2>=0)//以y=x+b為直線,且y-x>=0時

}else}}

for(int i=0; iint sum=0;

x=a[i],y=b[i];

int f1=x+y,f2=y-x;

if(xx[x][0]==xx[x][1]);//橫向

else

if(xx[x][0]==y||xx[x][1]==y)

sum++;

else sum+=2;

if(yy[y][0]==yy[y][1]);//縱向

else

if(yy[y][0]==x||yy[y][1]==x)

sum++;

else sum+=2;

if(yx[f1][0]==yx[f1][1]);//斜向下

else

if(yx[f1][0]==y||yx[f1][1]==y)

sum++;

else sum+=2;

if(f2>=0)//斜向上

else

ans[sum]++;//個數加一

}for(int i=0; i<8; i++)//輸出

printf("%d ",ans[i]);

printf("%d\n",ans[8]);

}return

0;}

m皇后(小白版)

本題 棋盤上有若干皇后,每個皇后有八個方向,分別是上 下 左 右 左上 右上 左下 右下。存在其他皇后在此皇后的這八個方向,那麼這個方向就是不安全的。最後輸出在0,1,2,3,4,5,6,7,8個方向上不安全的皇后的個數。看到這種皇后八個方向的問題,我們第一時間會想到的就是 八皇后問題 從 八皇后問...

leetcode題目思路

一 bruteforce o n 2 o 1 二 兩邊雜湊表 一遍雜湊表 o n o n 一 bruteforce o n 3 o 1 二 排序 雙指標 o n 2 去重 剪枝 four sum 排序 雙層迴圈 雙指標 棧 o n o n 擴充套件 只有一種括號?最長有效括號?leetcode 32...

ctf部分題目思路

一 ctf工具 web 1.firefox hackbar,firebug,tamper data,user agent switcher 2.burpsuite 3.sqlmap 隱寫 1.stegsolve 2.winhex 3.notepad 4.qr resuarch 5.binwalk 6...