思路:
首先看到題目的資料範圍是2e4顯然二維陣列是肯定不行的,先不說時間,單是記憶體就不夠用。雖然不能使用二維陣列,但如果可以一行一行的解決問題也是可以的,但用暴力只能60分,汗~~~~。於(shang)是(wang)想(sou)到(suo)通過每乙個皇后對某一行的影響來計算這一行最後剩下了多少位置,每一次sum求和就可以了,最終的時間複雜度大概是o(n*k).
ps: 這道題還用到了一丟丟數學知識:已知直線方程的斜率、線上乙個點的座標和另一點的橫座標求其縱座標。
#include
#include
using
namespace std;
int x[
505]
, y[
505]
;int row[
20005
], col[
20005];
int sum =
0, cnt =0;
int n, m, k, a;
//a是橫座標
intmain()
for(
int i =
1; i <= n; i++
)//數學思想:斜率為1和-1的直線方程
//求當前皇后是否影響了當前行
a = i + y[j]
- x[j];if
(a >=
1&& a <= m&&col[a]==0
)//1
a = y[j]
+ x[j]
- i;
if(a >=
1&& a <= m&&col[a]==0
)//-1
} sum +
= cnt;}}
cout << sum;
return0;
}
大概就是這樣了,自己還是太菜了~~~ 洛谷 八皇后
題目傳送門 好的滿分方法 傳送門 它講的非常詳細,仔細一看方法和我的差不多,不同點在於斜的兩個標記和豎的標記它分別為這個開了三個陣列,然後用來存這裡是否已經被占領,然後遞迴完下乙個再恢復,我本來也想這樣的,但我只想到用乙個二維陣列的方法,這樣是不可能回溯的,所以導致我最後乙個資料超時而他沒超時 通過...
洛谷 P1219 八皇后
題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 ...
洛谷 P1219 八皇后
題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 ...