洛谷1123 取數遊戲

2022-05-12 13:19:38 字數 1405 閱讀 4213

題目描述

乙個n×m的由非負整數構成的數字矩陣,你需要在其中取出若干個數字,使得取出的任意兩個數字不相鄰(若乙個數字在另外乙個數字相鄰8個格仔中的乙個即認為這兩個數字相鄰),求取出數字和最大是多少。

輸入輸出格式

輸入格式:

輸入第1行有乙個正整數t,表示了有t組資料。

對於每一組資料,第1行有兩個正整數n和m,表示了數字矩陣為n行m列。

接下來n行,每行m個非負整數,描述了這個數字矩陣。

輸出格式:

輸出包含t行,每行乙個非負整數,輸出所求得的答案。

輸入輸出樣例

輸入樣例#1: 複製

3 4 4

67 75 63 10

29 29 92 14

21 68 71 56

8 67 91 25

2 3

87 70 85

10 3 17

3 3

1 1 1

1 99 1

1 1 1

輸出樣例#1: 複製

271

172

99 說明

對於第1組資料,取數方式如下:

[67] 75 63 10

29 29 [92] 14

[21] 68 71 56

8 67 [91] 25

對於20%的資料,n, m≤3;

對於40%的資料,n, m≤4;

對於60%的資料,n, m≤5;

對於100%的資料,n, m≤6,t≤20。

此題用資料範圍較小,所以深搜。注意一下不能用bool型別來標記取過的數周圍的數,如:

67 75 63 10

29 29 92 14

21 68 71 56

8 67 91 25。

這一組資料,

第一遍搜尋會選到67,63,21,71,如果用bool型別標記

周圍的數,回溯71時68,67就再次可以被選,而68,67有因為有21的限制不能選,所以只能用乙個累加的b陣列。

#include

using

namespace

std;

int t,n,m,a[8][8],ans=-1;

int x[9]=,

y[9]=;

int b[8][8];

inline

void dfs(int ii,int jj,int sum)

if(ii==n+1)

if(!b[ii][jj])

dfs(ii,jj+1,sum); //如果不選。

}int main()

dfs(1,1,0);

printf("%d\n",ans);

}}

洛谷 p1123取數遊戲

定義乙個dfs函式,函式有三個變數,分別是i,j,sum。i,j分別代表訪問的這個點的座標,sum表示這條路徑上的數字的和。思路是 從 1,1 這個點進入,依次以先列數增加,然後行數增加在訪問所有的點。如下 include include include using namespace std in...

洛谷 P1123 取數遊戲

洛谷傳送門 乙個n times mn m的由非負整數構成的數字矩陣,你需要在其中取出若干個數字,使得取出的任意兩個數字不相鄰 若乙個數字在另外乙個數字相鄰88個格仔中的乙個即認為這兩個數字相鄰 求取出數字和最大是多少。第1行有乙個正整數tt,表示了有tt組資料。對於每一組資料,第一行有兩個正整數nn...

洛谷 P1123 取數遊戲

乙個n m的由非負整數構成的數字矩陣,你需要在其中取出若干個數字,使得取出的任意兩個數字不相鄰 若乙個數字在另外乙個數字相鄰8個格仔中的乙個即認為這兩個數字相鄰 求取出數字和最大是多少。輸入格式 輸入第1行有乙個正整數t,表示了有t組資料。對於每一組資料,第1行有兩個正整數n和m,表示了數字矩陣為n...