1. 程式人生 > >圖論--走出泥潭

圖論--走出泥潭

sin namespace amp nod name pac 之間 cst ems

題目描述:

探險隊要穿越泥潭,必須選擇可踩踏的落腳點。可是泥潭面積很大,落腳點又實在少得可憐,一不小心就會深陷泥潭而無法脫身。偵查員費盡周折才從老鄉手裏弄到了一份地圖,圖中標出了落腳點的位置,而且令人震驚的是:泥潭只有一條穿越路線,且對於nxm的地圖,路線長度為n+m-1!請編程為探險隊找出穿越路線。

輸入描述:

兩個整數n和m,表示泥潭的長和寬。下面n行m列表示地形(0 表示泥潭,1 表示落腳點)

輸出描述:

用坐標表示穿越路線,坐標之間用>分隔

樣例輸入:

6 9

1 1 1 0 0 0 0 0 0

0 0 1 1 1 0 0 0 0

0 0 0 0 1 0 0 0 0

0 0 0 0 1 1 0 0 0

0 0 0 0 0 1 1 1 1

0 0 0 0 0 0 0 0 1

樣例輸出:

(1,1)>(1,2)>(1,3)>(2,3)>(2,4)>(2,5)>(3,5)>(4,5)>(4,6)>(5,6)>(5,7)>(5,8)>(5,9)>(6,9)

這題困擾了好幾天之前把他當成了BFS發現行不通,今天用DFS寫了一遍算是對這個的復習吧

下面附上本校oj的AC代碼:

#include<iostream>
#include<cstring>
using namespace std;
const int N=101;
int map[N][N];
int n,m;
struct point{
int l,r;
}node[N];//結構體數組用來存儲路徑


int ans;
void DFS(int x,int y)//這是深度優先搜索實現過程,本質就是一個遞歸的過程
{
if(x==n&&y==m)
{
for(int i=1;i<ans;i++)
cout<<"("<<node[i].l<<","<<node[i].r<<")>";
cout<<"("<<x<<","<<y<<")"<<endl;
// cout<<ans<<endl;
}
else{
if(map[x][y]==1&&x<=n&&y<=m)
{
node[ans].l=x;
node[ans].r=y;
ans++;
DFS(x+1,y);
DFS(x,y+1);
}
}
}
int main()
{
while(cin>>n>>m)
{
ans=1;
memset(map,0,sizeof(map));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>map[i][j];
DFS(1,1);
}
return 0;
}

圖論--走出泥潭