数据结构上机题四:滑雪问题

数据结构上机题四:滑雪问题_第1张图片
ski.h

#ifndef _SKI_H
#define _SKI_H

#include
#include

using namespace std;

const int maxcolrow = 20;
struct Pos {
	int row;
	int col;
};

class Ski
{
public:
    Ski();
    virtual~Ski();
    void InitSki(int s[][20],int n);
	void PrintSki_d(int n);
	void PrintSki_b(int n);
private:
    int DFS(int i,int j,int m);
    int BFS(int i,int j,int m);
    Pos cur;
    Pos pstart;
	int matrix[maxcolrow][maxcolrow];
	int count_d[maxcolrow][maxcolrow];
	int count_b[maxcolrow][maxcolrow];//decide whether in the queue
	Pos BFS_[maxcolrow][maxcolrow];
	int BackTrack(Pos cur);
	queue<Pos> skiqueue;
};
#endif // _SKI_H

ski.cpp

#include "Ski.h"
#include 
Ski::Ski()
{

}

Ski::~Ski()
{

}


void Ski::InitSki(int p[][20], int n) {
	for (int z=0;z<n;z++)
    {
        for (int zz =0; zz<n; zz++)
        {
            matrix[z][zz]=p[z][zz];
		}
	}
	/*for (int z =0; z
	for (int z =0;z<n;z++) {
		for (int zz=0;zz<n;zz++) {
			count_d[z][zz]=-1;
		}
	}
    /*for (int z = 0; z 
    for (int z =0;z<n;z++) {
		for (int zz=0;zz<n;zz++) {
			count_b[z][zz]=0;
		}
	}
}

int Ski::DFS(int i,int j,int m)
{
    if(count_d[i][j]!=-1)
    {
        return count_d[i][j];
    }
    int Max=0;
    if(i>0&&matrix[i][j]>matrix[i-1][j]&&Max<DFS(i-1,j,m))
    {
        Max=DFS(i-1,j,m);
    }
    if(i<m-1&&matrix[i][j]>matrix[i+1][j]&&Max<DFS(i+1,j,m))
    {
        Max=DFS(i+1,j,m);
    }
    if(j<m-1&&matrix[i][j]>matrix[i][j+1]&&Max<DFS(i,j+1,m))
    {
        Max=DFS(i,j+1,m);
    }
    if(j>0&&matrix[i][j]>matrix[i][j-1]&&Max<DFS(i,j-1,m))
    {
        Max=DFS(i,j-1,m);
    }
    count_d[i][j]=Max+1;
    return count_d[i][j];
}

void Ski::PrintSki_d(int n)
{
    for(int z=0;z<n;z++)
    {
        for(int zz=0;zz<n;zz++)
        {
            count_d[z][zz]=DFS(z,zz,n);
        }
    }
    int num=0;
    for(int z=0;z<n;z++)
    {
        for(int zz=0;zz<n;zz++)
        {
            cout<<count_d[z][zz]<<" ";
            if(count_d[z][zz]>num)
            {
                num=count_d[z][zz];
            }
        }
        cout<<endl;
    }
    cout<<num<<endl;
}
int Ski::BFS(int i,int j,int m)
{
    pstart.row=i;
    pstart.col=j;
    int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
    while(!skiqueue.empty())
    {
        skiqueue.pop();
    }
    skiqueue.push(pstart);
    while(!skiqueue.empty())
    {
        int k=0;
        Pos cur=skiqueue.front();
        skiqueue.pop();
        for(int z=0;z<4;z++)
        {
            Pos next;
            next.row=cur.row+dir[z][0];
            next.col=cur.col+dir[z][1];
            if(next.row>=0&&next.row<m&&next.col>=0&&next.col<m&&matrix[cur.row][cur.col]>matrix[next.row][next.col])
            {
                skiqueue.push(next);
                BFS_[next.row][next.col].row = cur.row;
				BFS_[next.row][next.col].col = cur.col;
                k=1;
            }

        }
        if(k==0)
        {
			return BackTrack(cur);
        }
    }

}
int Ski::BackTrack(Pos cur) {
	/*for(int z=1;z<=n_colrow_;z++){
		for(int zz=1;zz<=n_colrow_;zz++){
			cout<
	int cnt=0;
	while (cur.row != pstart.row || cur.col != pstart.col) {
		cnt++;
		cur = BFS_[cur.row][cur.col];
	}
	cnt=cnt+1;
	return cnt;

}
void Ski::PrintSki_b(int n)
{
    for(int z=0;z<n;z++)
    {
        for(int zz=0;zz<n;zz++)
        {
            count_b[z][zz]=BFS(z,zz,n);
        }
    }
    int num=0;
    for(int z=0;z<n;z++)
    {
        for(int zz=0;zz<n;zz++)
        {
            cout<<count_b[z][zz]<<" ";
            if(count_b[z][zz]>num)
            {
                num=count_b[z][zz];
            }
        }
        cout<<endl;
    }
    cout<<num<<endl;
}

main.cpp

#include 
#include "Ski.h"

using namespace std;

int main()
{
    int a[20][20];
    int i,j;
    int max_;
    cout<<"最大的行列是:"<<endl;
    cin>>max_;
    for(i=0;i<max_;i++)
    {
        for(j=0;j<max_;j++)
        {
            cin>>a[i][j];
        }
    }
    Ski ski;
    ski.InitSki(a,max_);
    ski.PrintSki_d(max_);
    ski.PrintSki_b(max_);

    return 0;
}

你可能感兴趣的:(数据结构)