1. 程式人生 > >初見dfs,用dfs計算二維陣列和

初見dfs,用dfs計算二維陣列和

原題的網址(一道很水的題)
程式碼如下

#include<bits/stdc++.h>
using namespace std;
int sum=0,num[100][100],jz[100][100],n;
void dfs(int x,int y)
{
	for(int i=-1;i<=1;i++)
	for(int j=-1;j<=1;j++)
	if(i!=0||j!=0)
	{
		int x1=x+i;
		int y1=y+j;
		if(x1>=0&&x1<n-1&&y1>=0&&y1<n-1&&
!jz[x1][y1]&&x1+y1!=n-1)//剪枝 { jz[x1][y1]=1; sum+=num[x1][y1]; dfs(x1,y1); } } } int main() { cin>>n; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>num[i][j]; jz[0][0]=1; sum+=num[0][0]; dfs(0,0); cout<<sum; }

當然還有大佬提供的別的方法 比如並查集

#include <bits/stdc++.h>
using namespace std; int f[110],mp[110][110],sum; int find(int k) { return f[k]==k?k:f[k]=find(f[k]); } int num(int x,int y) { return x*10+y; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin>>n; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>mp[
i][j]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) f[num(i,j)]=num(i,j); for(int i=0;i<n;i++) for(int j=0;j<n;j++) { if(i==n-1||j==n-1||i+j==n-1) continue; f[find(num(i,j))]=find(num(0,0)); } for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(find(num(i,j))==find(num(0,0))) sum+=mp[i][j]; cout<<sum; }

雖然這麼簡單的一道題目用dfs有點殺雞用牛刀,但是這是我第一次接觸dfs程式,對我理解dfs有著很大的作用