1. 程式人生 > 實用技巧 >取數遊戲

取數遊戲

題目描述

一個N \times MN×M的由非負整數構成的數字矩陣,你需要在其中取出若干個數字,使得取出的任意兩個數字不相鄰(若一個數字在另外一個數字相鄰88個格子中的一個即認為這兩個數字相鄰),求取出數字和最大是多少。

輸入格式

第1行有一個正整數TT,表示了有TT組資料。

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

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

輸出格式

TT行,每行一個非負整數,輸出所求得的答案。

輸入輸出樣例

輸入

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

 輸出

271
172
99

  

分析

  選擇每種情況的時候會影響到後面的情況,所以需要用陣列儲存,之後直接搜尋即可

程式

#include <bits/stdc++.h>
#define F(i , a , b) for(int i = (a) ; i <= (b) ; i++)

using namespace std;

int T, n, m, a[1001][1001];
int ans;
int check[1001][1001];

void dfs(int x , int y , int z)
{
	if(x > n)
	{
		ans = max(ans , z);
		return;
	}
	int X_Next = x;
	int Y_Next = y + 1;
	if(Y_Next > m)
	{
		Y_Next = 1;
		X_Next = x + 1;
	}
	if(! check[x - 1][y - 1] && ! check[x - 1][y] && ! check[x - 1][y + 1] && ! check[x][y - 1] && ! check[x][y + 1] && ! check[x + 1][y - 1] && ! check[x + 1][y] && ! check[x + 1][y + 1])
	{
		check[x][y] = 1;
		dfs(X_Next , Y_Next , z + a[x][y]);
		check[x][y] = 0;
	}
	dfs(X_Next , Y_Next , z);
}

int main()
{
	ios::sync_with_stdio(0);
	cin >> T;
	F(k , 1 , T)
	{
		ans = 0;
		cin >> n >> m;
		F(i , 1 , n)
			F(j , 1 , m)
				cin >> a[i][j];
		dfs(1 , 0 , 0);
        cout << ans << endl;
	}
	return 0;
}