Advertisement
a53

card

a53
Jan 29th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.57 KB | None | 0 0
  1. #include <fstream>
  2. using namespace std;
  3. int xd[]={-1,-1,0,1,1,1,0,-1},
  4. yd[]={0,1,1,1,0,-1,-1,-1};
  5. long long val;
  6. int n,m,k,a[52][52],viz[52][52],xstart,ystart,nrsol,sol[20],nr,s[20],nrsolutii;
  7.  
  8. void copie(int s[],int sol[],int nrsol)
  9. {
  10. for(int i=1;i<=nrsol;++i)
  11. sol[i]=s[i];
  12. }
  13.  
  14. void bordare()
  15. {
  16. int i;
  17. for(i=0;i<=n+1;++i)
  18. viz[i][0]=viz[i][m+1]=-1;
  19. for(i=0;i<=m+1;++i)
  20. viz[0][i]=viz[n+1][i]=-1;
  21. }
  22.  
  23. void citire()
  24. {
  25. ifstream f("card.in");
  26. int i,j;
  27. f>>n>>m>>xstart>>ystart>>k;
  28. for(i=1;i<=n;++i)
  29. for(j=1;j<=m;++j)
  30. f>>a[i][j];
  31. f.close();
  32. }
  33.  
  34. void becktracking(int x,int y)
  35. {
  36. int xn,yn;
  37. if(val==a[xstart][ystart])
  38. {
  39. if(nr<nrsol||nrsol==k+1)
  40. {
  41. nrsol=nr;nrsolutii=1;k=nr;
  42. copie(s,sol,nrsol);
  43. }
  44. else
  45. if(nr==nrsol) /// solutia s are nr elemente; sol optima sol are nrsol elemente
  46. {
  47. ++nrsolutii; /// nrsolutii retine numar de solutii obtinute
  48. if(s[nr]<sol[nrsol])
  49. copie(s,sol,nrsol);
  50. else
  51. if(s[nr]==sol[nrsol]&&s[1]<sol[1])
  52. copie(s,sol,nrsol);
  53. }
  54. }
  55. else
  56. for(int dir=0;dir<8;dir++)
  57. {
  58. xn=x+xd[dir];yn=y+yd[dir];
  59. if(viz[xn][yn]==0&&nr<k)
  60. {
  61. viz[xn][yn]=1;
  62. for(int i=0;i<4;i++) /// aleg operatia
  63. {
  64. switch(i)
  65. {
  66. case 0:val+=a[xn][yn];break;
  67. case 1:val-=a[xn][yn];break;
  68. case 2:val+=2*a[xn][yn];break;
  69. case 3:val+=(a[xn][yn]/2);break;
  70. }
  71. ++nr;
  72. s[nr]=a[xn][yn];
  73. becktracking(xn,yn);
  74. --nr;
  75. switch(i)
  76. { case 0:val-=a[xn][yn];break;
  77. case 1:val+=a[xn][yn];break;
  78. case 2:val-=2*a[xn][yn];break;
  79. case 3:val-=(a[xn][yn]/2);break;
  80. }
  81. }
  82. viz[xn][yn]=0;
  83. }
  84. }
  85. }
  86.  
  87. int main()
  88. {
  89. int i;
  90. citire();
  91. bordare();
  92. viz[xstart][ystart]=1;
  93. nr=0;
  94. nrsol=k+1;
  95. becktracking(xstart,ystart);
  96. ofstream g("card.out");
  97. g<<nrsolutii<<'\n';
  98. for(i=1;i<=nrsol;++i)
  99. g<<sol[i]<<' ';
  100. g.close();
  101. return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement