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;
}