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


ski.h

#ifndef _SKI_H
#define _SKI_H

#include<iostream>
#include<queue>

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 <algorithm>
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<n; z++) {
		for (int zz =0; zz <n; zz++) {
			cout<<matrix[z][zz]<<" ";
		}
		cout<<endl;
	}*/
	for (int z =0;z<n;z++) {
		for (int zz=0;zz<n;zz++) {
			count_d[z][zz]=-1;
		}
	}
    /*for (int z = 0; z <n; z++) {
		for (int zz=0;zz<n;zz++) {
			cout<<count_[z][zz]<<" ";
		}
		cout<<endl;
	}*/
    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<<backPathBFS_[z][zz].row<<","<<backPathBFS_[z][zz].col<<" ";
		}
		cout<<endl;
	}*/
	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 <iostream>
#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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值