Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define N 35
- using namespace std;
- ifstream fin("card.in");
- ofstream fout("card.out");
- int a[N][N];
- int n, m,X, Y,K;
- int dl[]={-1,-1,-1,0,0,1,1,1};
- int dc[]={-1,0,1,-1,1,-1,0,1};
- int viz[N][N], x[N],sol[N],lmin=8;
- int nrsol;
- void Citire()
- {
- fin>>n>>m>>X>>Y>>K;
- for(int i=1;i<=n;i++)
- for(int j=1;j<=m;j++)
- fin>>a[i][j];
- }
- void SolFin(int k)
- {
- if(k<lmin){lmin=k; nrsol=1;
- for(int i=1;i<=k;i++)sol[i]=x[i];
- }
- else if(k==lmin)
- {
- nrsol++;
- if(x[k]<sol[k])
- for(int i=1;i<=k;i++)sol[i]=x[i];
- else
- if(x[k]==sol[k]&& x[1]<sol[1])
- for(int i=1;i<=k;i++)sol[i]=x[i];
- }
- }
- void Back(int k, int l, int c, int Puncte)
- {
- int lv, cv;
- for(int i=0;i<8;i++)
- if(viz[l+dl[i]][c+dc[i]]==0 &&a[l+dl[i]][c+dc[i]]!=0)
- {
- lv=l+dl[i]; cv=c+dc[i];
- x[k]=a[lv][cv];
- viz[lv][cv]=1;
- if(Puncte-2*x[k]==0) SolFin(k);
- else if(k<K)Back(k+1,lv,cv,Puncte-2*x[k]);
- if(Puncte-x[k]/2==0) SolFin(k);
- else if(k<K)Back(k+1,lv,cv,Puncte-x[k]/2);
- if(Puncte+x[k]==0) SolFin(k);
- else if(k<K)Back(k+1,lv,cv,Puncte+x[k]);
- if(Puncte-x[k]==0) SolFin(k);
- else if(k<K)Back(k+1,lv,cv,Puncte-x[k]);
- viz[lv][cv]=0;
- }
- }
- int main()
- {
- Citire();
- viz[X][Y]=1;
- Back(1,X,Y,a[X][Y]);
- fout<<nrsol<<'\n';
- for(int i=1;i<=lmin;i++)fout<<sol[i]<<' ';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment