洛谷 p1123取數遊戲

2021-08-19 01:58:47 字數 1431 閱讀 8903

定義乙個dfs函式,函式有三個變數,分別是i,j,sum。i,j分別代表訪問的這個點的座標,sum表示這條路徑上的數字的和。

思路是:從(1,1)這個點進入,依次以先列數增加,然後行數增加在訪問所有的點。

**如下

#include

#include

#include

using namespace std;

int ans=0;

int a[20][20];

int visited[20][20];

int n,m,t;

void dfs(int i,int j,int sum)

int ii=i,jj=j+1;//定義出訪問的下乙個點,先列數增加,然後再就是列數增加

if(jj>m)//當列數大於給定的列數時,換到下一行

if(!visited[i-1][j-1]&&!visited[i-1][j]&&!visited[i-1][j+1]&&!visited[i][j-1])//當i,j這個點的左上,右上,正上,左邊的點沒有被標記時,說明這個點可以訪問

dfs(ii,jj,sum);//不選這個點,直接訪問下乙個點。

}int main()

{cin>>t;

while (t--)

{memset(visited,0,sizeof(visited));

cin>>n>>m;

for(int i=1;i<=n;i++)

for(int j=1;j<=m;j++)

cin>>a[i][j];

dfs(1,1,0);

cout《我們假設把(i,j)當做第乙個點,即路徑的開頭

以下這段話就是按照上面的前提來說的

遞迴函式dfs(i,j,sum)的最後一行是不選(i,j)這個點後在進入下乙個訪問的點,為啥要這麼做呢?進入dfs(i,j,sum)一共有2種情況,第一種是if(!visited[i-1][j-1]&&!visited[i-1][j]&&!visited[i-1][j+1]&&!visited[i][j-1])這個條件不滿足時進入,此時通過dfs(i,j,sum)進入這個不滿足條件的點的下乙個點,繼續進行訪問下面的點。還有一種情況是滿足if(!visited[i-1][j-1]&&!visited[i-1][j]&&!visited[i-1][j+1]&&!visited[i][j-1])這個條件,函式返回到dfs(ii,jj,sum+a[i][j])後繼續往下進行到達了dfs(ii,jj,sum),第二種情況說明以(i,j)這個點往下延伸的所有路徑都已經訪問完成了,那麼,就通過dfs(ii,jj,sum)這個語句來訪問不包括(i,j)這個點的路徑。 這兩種情況是有區別的,第一種是(i,j)這個點不能選,迫不得已選擇(i,j)以後的點。而第二種情況是(i,j)這個點可以選並且已經選過了,換句話說就是包含(i,j)這個點的所有了路徑都已經訪問了,那麼通過dfs(i,j,sum)這個語句來訪問不包含(i,j)這個點的其他的路徑

洛谷 P1123 取數遊戲

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

洛谷 P1123 取數遊戲

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

P1123 取數遊戲(洛谷)

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