#include <fstream>
using namespace std;
ifstream is("hercule.in");
ofstream os("hercule.out");
const int di[]={-1,0,1,0};
const int dj[]={0,1,0,-1};
int a[100][100], x[100][100], m,n,pmin=10000,nr=0;
void citire()
{
is>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
is>>a[i][j];
}
void afis(int x[100][100])
{
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
os<<x[i][j]<<" ";
os<<endl;
}
os<<endl;
}
void alege(int pas)//alege minimul si numarul de drumuri de lungime minima
{
if(pas<pmin) { pmin=pas; nr=1;}
else if(pas==pmin) nr++;
}
void back(int i, int j, int pas)
{
x[i][j]=pas;
if(i==m && j==n) alege(pas);
else
for(int d=0;d<4;d++)
{
int inou=i+di[d];
int jnou=j+dj[d];
if(pas<a[inou][jnou] && x[inou][jnou]==0 && pas<pmin) //inca nu e capcana, e pozitie noua si nu s-a depasit nr min de pasi
back(inou,jnou,pas+1);
}
x[i][j]=0;
}
void backmin(int i, int j, int pas) //face doar drumurile de lungime minima
{
x[i][j]=pas;
if(i==m && j==n && pas==pmin) afis(x);
else
for(int d=0;d<4;d++)
{
int inou=i+di[d];
int jnou=j+dj[d];
if(pas<a[inou][jnou] && x[inou][jnou]==0 && pas<pmin)
backmin(inou,jnou,pas+1);
}
x[i][j]=0;
}
int main()
{
citire();
back(1,1,1);
os<<pmin<<" "<<nr<<endl;
backmin(1,1,1);
is.close();
os.close();
return 0;
}
sau
#include <fstream>
using namespace std;
ifstream is("hercule.in");
ofstream os("hercule.out");
const int di[]={-1,0,1,0};
const int dj[]={0,1,0,-1};
int a[100][100], x[100][100], m,n,pmin=10000,nr=0;
void citire()
{
is>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
is>>a[i][j];
}
void afis(int x[100][100])
{
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
os<<x[i][j]<<" ";
os<<endl;
}
os<<endl;
}
void alege(int pas)
{
if(pas<pmin) { pmin=pas; nr=1;}
else if(pas==pmin) nr++;
}
void creste()
{
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
a[i][j]++;
}
void scade()
{
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
a[i][j]--;
}
void back(int i, int j, int pas)
{
scade();
x[i][j]=pas;
if(i==m && j==n) alege(pas);
else
for(int d=0;d<4;d++)
{
int inou=i+di[d];
int jnou=j+dj[d];
if(a[inou][jnou]>0 && x[inou][jnou]==0 && pas<pmin)
{
back(inou,jnou,pas+1);
}
}
x[i][j]=0;
creste();
}
void backmin(int i, int j, int pas) //face doar drumurile de lungime minima
{
scade();
x[i][j]=pas;
if(i==m && j==n && pas==pmin) afis(x);
else
for(int d=0;d<4;d++)
{
int inou=i+di[d];
int jnou=j+dj[d];
if(a[inou][jnou]>0 && x[inou][jnou]==0 && pas<pmin)
{
backmin(inou,jnou,pas+1);
}
}
x[i][j]=0;
creste();
}
int main()
{
citire();
back(1,1,1);
os<<pmin<<" "<<nr<<endl;
backmin(1,1,1);
is.close();
os.close();
return 0;
}
|