dfs通俗概念:
例题一、城堡问题
解题思路:
详细C++代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int R, C;
int rooms[60][60];
int color[60][60];
int maxRoomArea = 0, roomNum = 0;
int roomArea;
void Dfs(int i, int k)
{
if(color[i][k])
return;
++roomArea;
color[i][k] = roomNum;
if((rooms[i][k] & 1) == 0)
Dfs(i, k - 1);
if((rooms[i][k] & 2) == 0)
Dfs(i - 1, k);
if((rooms[i][k] & 4) == 0)
Dfs(i, k + 1);
if((rooms[i][k] & 8) == 0)
Dfs(i + 1, k);
}
int main()
{
cin >> R >> C;
for(int i = 1; i <= R; ++i)
{
for(int k = 1; k <= C; ++k)
{
cin >> rooms[i][k];
}
}
memset(color, 0, sizeof(color));
for(int i = 1; i <= R; ++i)
{
for(int k = 1; k <= C; ++k)
{
if(!color[i][k])
{
++roomNum;
roomArea = 0;
Dfs(i, k);
maxRoomArea = max(roomArea, maxRoomArea);
}
}
}
cout << roomNum << endl;
cout << maxRoomArea << endl;
}
样例运行结果如下:
例题二、踩方格
详细C++代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int visited[30][50];
int ways(int i, int j, int n)
{
if(n == 0)
return 1;
visited[i][j] = 1;
int num = 0;
if(!visited[i][j - 1])
num += ways(i, j - 1, n - 1);
if(!visited[i][j + 1])
num += ways(i, j + 1, n - 1);
if(!visited[i + 1][j])
num += ways(i + 1, j, n - 1);
visited[i][j] = 0;
return num;
}
int main()
{
int n;
cin >> n;
memset(visited, 0, sizeof(visited));
cout << ways(0, 25, n) << endl;
return 0;
}