Advertisement
Guest User

Untitled

a guest
Dec 21st, 2014
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <sstream>
  5. #include <cstdlib>
  6.  
  7. using namespace std;
  8.  
  9. struct ter
  10. {
  11. int hossz;
  12. bool teli;
  13. int kezd;
  14. int egyesek;
  15. ter(){};
  16. ter (int h, bool t, int k, int e)
  17. {
  18. hossz=h;
  19. teli=t;
  20. kezd=k;
  21. egyesek=e;
  22. }
  23. };
  24.  
  25. struct hasab
  26. {
  27. vector<int > torzs;
  28. int trivial;
  29. int Max;
  30. int Maxhely;
  31. int Min;
  32. int kesz;
  33. int kesz1;
  34. int sum;
  35. int ja0; /// Sor: jobb, Oszlop: alsó
  36. int bf0; /// Sor: bal, Oszlop: felsõ
  37. vector<int> versenyben;
  38. vector<ter> inters;
  39. int fog; //space with one
  40.  
  41. hasab(vector<int> t, int s) //s=size
  42. {
  43. kesz=0;
  44. kesz1=0;
  45. torzs = t;
  46. Max=0;
  47. Maxhely=0;
  48. trivial=0;
  49. sum=0;
  50. fog=0;
  51. //bf0=0;
  52. ja0=s-1;
  53. ter te(s,0,0,0);
  54. inters.push_back(te);
  55. for(int i=0; i<t.size(); i++)
  56. {
  57. if (torzs[i]>Max) {Max=torzs[i]; Maxhely=i; }
  58.  
  59. trivial+=torzs[i]+1;
  60. sum+=torzs[i];
  61. versenyben.push_back(2);
  62. }
  63. trivial--;
  64.  
  65. }
  66. };
  67.  
  68. struct Rejtveny
  69. {
  70. bool hiba;
  71. int osszkesz;
  72. int sx;
  73. int sy;
  74. vector<hasab> elso;
  75. vector<hasab> masodik;
  76. vector<vector<int> > mo;
  77. void Beolvas();
  78. void Megoldas();
  79. void Trivialis();
  80. void Atir(int x, int y, int e);
  81. void Minusz(char mi, int hol);
  82. void Mo_maker();
  83. void Terelo(int x, int y);
  84. void Keres_0(int x, int y);
  85. void Advheu_13(int h, char mi);
  86. void Heuveg(int x, int y, char mi, char irany);
  87. void Heu_13(int s, char o, int h);
  88. void Sheu_13(int kezd, int veg, int sz, char o, int s);
  89. };
  90.  
  91. void Rejtveny::Beolvas()
  92. {
  93. ifstream f("kod1.txt");
  94. string s1, s2;
  95. string kuka;
  96. hiba=0;
  97. osszkesz=0;
  98. getline(f, s1, ';');
  99. getline(f, s2);
  100. int s1_int=atoi(s1.c_str());
  101. int s2_int=atoi(s2.c_str());
  102. getline(f, kuka);
  103. sx=s1_int;
  104. sy=s2_int;
  105.  
  106. for (int i=0; i<s1_int; i++)
  107. {
  108. vector<int> temp;
  109. string s;
  110. stringstream ss;
  111.  
  112. getline(f, s);
  113. ss<<s;
  114.  
  115. while(ss.good())
  116. {
  117. string s3;
  118. getline(ss, s3, ',');
  119. int s3_int=atoi(s3.c_str());
  120. if (s3_int!=0) temp.push_back(s3_int);
  121. }
  122. hasab h (temp,sy);
  123. h.ja0=sy-1;
  124. elso.push_back(h);
  125. }
  126. getline(f, kuka);
  127. for (int i=0; i<s2_int; i++)
  128. {
  129. vector<int> temp;
  130. string s;
  131. stringstream ss;
  132.  
  133. getline(f, s);
  134. ss<<s;
  135.  
  136. while(ss.good())
  137. {
  138. string s3;
  139. getline(ss, s3, ',');
  140. int s3_int=atoi(s3.c_str());
  141. if (s3_int!=0) temp.push_back(s3_int);
  142. }
  143. hasab h (temp,sx);
  144. h.ja0=sx-1;
  145. masodik.push_back(h);
  146. }
  147.  
  148. // for(int i=0; i<elso.size(); i++)
  149. // {
  150. // for(int j=0; j<elso[i].torzs.size(); j++)
  151. // {
  152. // cout << elso[i].torzs[j] << ", ";
  153. // }
  154. // cout << endl;
  155. // }
  156. }
  157.  
  158. void Rejtveny::Mo_maker()
  159. {
  160. vector<int> seged1(sy,0);
  161. vector<vector <int> > seged2(sx,seged1);
  162. mo=seged2;
  163. }
  164.  
  165. void Rejtveny::Minusz (char mi, int hol)
  166. {
  167. if (mi=='s')
  168. {
  169. for(int i=0; i<sy; i++)
  170. {
  171. if(mo[hol][i]==0) Atir(hol, i, -1);
  172. }
  173. }
  174. if (mi=='o')
  175. {
  176. for(int i=0; i<sx; i++)
  177. {
  178. if(mo[i][hol]==0) Atir(i, hol, -1);
  179. }
  180. }
  181. }
  182.  
  183. void Rejtveny::Terelo (int x, int y)
  184. {
  185. ter te;
  186. te.hossz=0;
  187. te.egyesek=0;
  188. vector<ter> elems;
  189. vector<ter> intert;
  190. int fog=0;
  191. elems.push_back(te);
  192. for (int i=0; i<sy; i++)
  193. {
  194. if (mo[x][i]==1) te.egyesek++;
  195. if (mo[x][i]==-1) {te.hossz=i+1; elems.push_back(te); te.egyesek=0;}
  196. }
  197. te.hossz=sy+1;
  198. elems.push_back(te);
  199. for (int i=1;i<elems.size();i++)
  200. {
  201. te.hossz=elems[i].hossz-elems[i-1].hossz-1;
  202. te.egyesek=elems[i].egyesek;
  203. te.kezd=elems[i-1].hossz;
  204. if (0<te.hossz)
  205. {
  206. te.teli=(te.egyesek==te.hossz);
  207. intert.push_back(te);
  208. if (te.egyesek > 0) fog++;
  209. }
  210. }
  211. elso[x].inters=intert;
  212. elso[x].fog=fog;
  213. te.hossz=0;
  214. te.egyesek=0;
  215. elems.clear();
  216. intert.clear();
  217. elems.push_back(te);
  218. for (int i=0; i<sx; i++)
  219. {
  220. if (mo[i][y]==1) te.egyesek++;
  221. if (mo[i][y]==-1) {te.hossz=i+1; elems.push_back(te); te.egyesek=0;}
  222. }
  223. te.hossz=sx+1;
  224. elems.push_back(te);
  225. fog=0;
  226. for (int i=1;i<elems.size();i++)
  227. {
  228. te.hossz=elems[i].hossz-elems[i-1].hossz-1;
  229. te.egyesek=elems[i].egyesek;
  230. te.kezd=elems[i-1].hossz;
  231. if (0<te.hossz)
  232. {
  233. te.teli=(te.egyesek==te.hossz);
  234. intert.push_back(te);
  235. if (te.egyesek > 0) fog++;
  236. }
  237. }
  238. masodik[y].inters=intert;
  239. masodik[y].fog=fog;
  240. }
  241.  
  242. void potolo(Rejtveny &r, vector<vector<int> > &mo, int x, int y)
  243. {
  244. // bool jo=0;
  245. // bool nulla=0;
  246. // //satírozott)
  247. // for (int i=y; i>=0; i--)
  248. // {
  249. // if (mo[x][i]==1) jo=1;
  250. // if (mo[x][i]==0) nulla=1;
  251. // if (mo[x][i]==-1&&i!=y) break;
  252. // }
  253. // jo=jo&&nulla;
  254. //
  255. // if(jo)
  256. // {
  257. // for (int i=0; i<r.elso[x].torzs.size(); i++)
  258. // {
  259. //
  260. // if()
  261. // }
  262. // }
  263. }
  264.  
  265. void Rejtveny::Keres_0(int x, int y)
  266. {
  267. if (y==elso[x].ja0)
  268. {
  269. for (int i=elso[x].ja0; i>=-1; i--)
  270. {
  271. if (i==-1){ elso[x].ja0=-1; break; }
  272. if (mo[x][i]==0){ elso[x].ja0=i; break; }
  273. }
  274. }
  275. if (y==elso[x].bf0)
  276. {
  277. for (int i=elso[x].bf0; i<=sy; i++)
  278. {
  279. if (i==sy){ elso[x].bf0=-1; break; }
  280. if (mo[x][i]==0){ elso[x].bf0=i; break; }
  281. }
  282. }
  283. if (x==masodik[y].ja0)
  284. {
  285. for (int i=masodik[y].ja0; i>=-1; i--)
  286. {
  287. if (i==-1){ masodik[y].ja0=-1; break; }
  288. if (mo[i][y]==0){ masodik[y].ja0=i; break; }
  289. }
  290. }
  291. if (x==masodik[y].bf0)
  292. {
  293. for (int i=masodik[y].bf0; i<=sx; i++)
  294. {
  295. if (i==sx){ masodik[y].bf0=-1; break; }
  296. if (mo[i][y]==0){ masodik[y].bf0=i; break; }
  297. }
  298. }
  299. }
  300.  
  301. void Rejtveny::Advheu_13(int h, char mi)
  302. {
  303. vector<hasab> tp;
  304. int egesz;
  305. if (mi=='s') { egesz=sy; tp=elso; }
  306. if (mi=='o') { egesz=sx; tp=masodik; }
  307.  
  308. if (tp[h].fog==tp[h].torzs.size())
  309. {
  310. int tart=0;
  311. for (int i=0; i<tp[h].inters.size();i++)
  312. {
  313. if (tp[h].inters[i].egyesek==0)
  314. {
  315. for (int j=0; j<tp[h].inters[i].hossz; j++)
  316. {
  317. if (mi=='s') Atir(h,tp[h].inters[i].kezd+j,-1);
  318. if (mi=='o') Atir(tp[h].inters[i].kezd+j,h,-1);
  319. }
  320. }
  321. else
  322. {
  323. tart++;
  324. int kezd=tp[h].inters[i].kezd;
  325. if (!tp[h].inters[i].teli)
  326. {
  327. //cout<<kezd<<" "<<kezd+tp[h].inters[i].hossz<<" "<<tp[h].torzs[tart-1]<<" "<<mi<<h<<endl;
  328. Sheu_13(kezd,kezd+tp[h].inters[i].hossz,tp[h].torzs[tart-1],mi,h);
  329. }
  330.  
  331. }
  332. }
  333. }
  334.  
  335. }
  336.  
  337. void Rejtveny::Heuveg(int x, int y, char mi, char irany)
  338. {
  339. if (mi=='s' && irany=='j')
  340. {
  341. int sum=0;
  342. for (int i=elso[x].ja0; i<sy; i++)
  343. {
  344. if (mo[x][i]==1) sum++;
  345. }
  346. int sumv=0;
  347. int j;
  348. for (int i=elso[x].torzs.size()-1;i>=0;i--)
  349. {
  350. sumv+=elso[x].torzs[i];
  351. if (sumv>=sum)
  352. {
  353. j=i;
  354. break;
  355. }
  356. }
  357. int i;
  358. for (i=1; i<elso[x].torzs[j]; i++)
  359. {
  360. Atir(x,y-i,1);
  361. }
  362. if (y-i>=0) Atir(x,y-i,-1);
  363.  
  364. }
  365. if (mi=='s' && irany=='b')
  366. {
  367. int sum=0;
  368. for (int i=elso[x].bf0; i>=0; i--)
  369. {
  370. if (mo[x][i]==1) sum++;
  371. }
  372. int sumv=0;
  373. int j;
  374. for (int i=0;i<=elso[x].torzs.size()-1;i++)
  375. {
  376. sumv+=elso[x].torzs[i];
  377. if (sumv>=sum)
  378. {
  379. j=i;
  380. break;
  381. }
  382. }
  383. int i;
  384. for (i=1; i<elso[x].torzs[j]; i++)
  385. {
  386. Atir(x,y+i,1);
  387. }
  388. if (y+i<sy) Atir(x,y+i,-1);
  389. }
  390. if (mi=='o' && irany=='j')
  391. {
  392. int sum=0;
  393. for (int i=masodik[y].ja0; i<sx; i++)
  394. {
  395. if (mo[i][y]==1) sum++;
  396. }
  397. int sumv=0;
  398. int j;
  399. for (int i=masodik[y].torzs.size()-1;i>=0;i--)
  400. {
  401. sumv+=masodik[y].torzs[i];
  402. if (sumv>=sum)
  403. {
  404. j=i;
  405. break;
  406. }
  407. }
  408. int i;
  409. for (i=1; i<masodik[y].torzs[j]; i++)
  410. {
  411. Atir(x-i,y,1);
  412. }
  413. if (x-i>=0) Atir(x-i,y,-1);
  414. }
  415. if (mi=='o' && irany=='b')
  416. {
  417. int sum=0;
  418. for (int i=masodik[y].bf0; i>=0; i--)
  419. {
  420. if (mo[i][y]==1) sum++;
  421. }
  422. int sumv=0;
  423. int j;
  424. for (int i=0;i<=masodik[y].torzs.size()-1;i++)
  425. {
  426. sumv+=masodik[y].torzs[i];
  427. if (sumv>=sum)
  428. {
  429. j=i;
  430. break;
  431. }
  432. }
  433. int i;
  434. for (i=1; i<masodik[y].torzs[j]; i++)
  435. {
  436. Atir(x+i,y,1);
  437. }
  438. if (x+i<sx) Atir(x+i,y,-1);
  439.  
  440. }
  441. }
  442.  
  443. void Rejtveny::Atir(int x, int y, int e)
  444. {
  445. if (mo[x][y]==0)
  446. {
  447.  
  448. mo[x][y]=e;
  449. elso[x].kesz++;
  450. masodik[y].kesz++;
  451. osszkesz++;
  452. if (e==1)
  453. {
  454. if (elso[x].ja0==y) Heuveg(x, y, 's', 'j');
  455. if (elso[x].bf0==y) Heuveg(x, y, 's', 'b');
  456. if (masodik[y].ja0==x) Heuveg(x, y, 'o', 'j');
  457. if (masodik[y].bf0==x) Heuveg(x, y, 'o', 'b');
  458. elso[x].kesz1++;
  459. masodik[y].kesz1++;
  460. if (elso[x].kesz1==elso[x].sum)
  461. {
  462. Minusz('s', x);
  463. }
  464. if (masodik[y].kesz1==masodik[y].sum)
  465. {
  466. Minusz('o', y);
  467. }
  468. }
  469. Terelo(x,y);
  470. Keres_0(x,y);
  471. }
  472. if (mo[x][y]==-e) hiba=1;
  473. }
  474.  
  475. void Rejtveny::Trivialis()
  476. {
  477. for (int i=0; i<sx; i++)
  478. {
  479. if (elso[i].trivial==sy)
  480. {
  481. int f=0;
  482. for (int j=0; j<elso[i].torzs.size(); j++)
  483. {
  484. for (int k=0; k<elso[i].torzs[j]; k++)
  485. {
  486. Atir(i,f, 1);
  487. f++;
  488. }
  489. if (f<sy) Atir(i,f, -1);
  490. f++;
  491. }
  492. }
  493.  
  494. if (elso[i].trivial==0)
  495. {
  496. for (int j=0; j<sy; j++)
  497. {
  498. Atir(i,j, -1);
  499. }
  500. }
  501.  
  502. }
  503.  
  504. for (int i=0; i<sy; i++)
  505. {
  506. if (masodik[i].trivial==sx)
  507. {
  508. int f=0;
  509. for (int j=0; j<masodik[i].torzs.size(); j++)
  510. {
  511. for (int k=0; k<masodik[i].torzs[j]; k++)
  512. {
  513. Atir(f,i, 1);
  514. f++;
  515. }
  516. if (f<sx) Atir(f,i, -1);
  517. f++;
  518. }
  519. }
  520. if (masodik[i].trivial==0)
  521. {
  522. for (int j=0; j<sx; j++)
  523. {
  524. Atir(j,i, -1);
  525. }
  526. }
  527. }
  528. }
  529.  
  530. void Rejtveny::Sheu_13(int kezd, int veg, int sz, char o, int s)
  531. {
  532. int in=veg-kezd;
  533. vector<int> sat;
  534. if (sz>in/2)
  535. {
  536. sat.push_back(in-sz);
  537. sat.push_back(2*sz-in);
  538. for (int i=0; i<sat[1]; i++)
  539. {
  540. if (o=='s') Atir(s,kezd+sat[0]+i,1);
  541. if (o=='o') Atir(kezd+sat[0]+i,s,1);
  542. }
  543. }
  544. }
  545.  
  546. void Rejtveny::Heu_13 (int s, char o, int h) //s=?sor/oszlop, o=sor/oszlop, h=?elemre
  547. {
  548. vector<hasab> temp;
  549. int egesz;
  550. if (o=='s')
  551. {
  552. egesz=sy;
  553. temp=elso;
  554. }
  555. if (o=='o')
  556. {
  557. egesz=sx;
  558. temp=masodik;
  559. }
  560. int sum=0;
  561. int kezd=0;
  562. vector<int> sat;
  563. for (int i=0; i<temp[s].torzs.size(); i++)
  564. {
  565. if (i>h) sum+=temp[s].torzs[i]+1;
  566. if (i<h) kezd+=temp[s].torzs[i]+1;
  567. }
  568. Sheu_13(kezd,egesz-sum,temp[s].torzs[h],o,s);//temp[s].torzs[temp[s].torzs.size()-1]);
  569. // if (sat.size()!=0)
  570. // {
  571. // for (int i=0; i<sat[1]; i++)
  572. // {
  573. // if (o=='s') Atir(s,kezd+sat[0]+i,1);
  574. // if (o=='o') Atir(kezd+sat[0]+i,s,1);
  575. // }
  576. // }
  577. }
  578.  
  579. void Rejtveny::Megoldas()
  580. {
  581. Mo_maker();
  582.  
  583. /// TRIVIALIS
  584. Trivialis();
  585. if (hiba)
  586. {
  587. cout<<"Hibas!"<<endl;
  588. return;
  589. }
  590. if (osszkesz==sx*sy)
  591. {
  592. cout<<"Ez a rejtveny trivialis, tustent megoldhato!"<<endl;
  593. return;
  594. }
  595.  
  596. /// HEU_13 (VALOGATAS)
  597. for (int i=0; i<elso.size();i++)
  598. {
  599. for (int j=0; j<elso[i].torzs.size(); j++)
  600. {
  601. int e=elso[i].torzs[j];
  602. if ((sy-elso[i].trivial+e)<2*e) Heu_13(i, 's', j);
  603.  
  604. }
  605. }
  606. for (int i=0; i<masodik.size();i++)
  607. {
  608. for (int j=0; j<masodik[i].torzs.size(); j++)
  609. {
  610. int e=masodik[i].torzs[j];
  611. if ((sy-masodik[i].trivial+e)<2*e) Heu_13(i, 'o', j);
  612. }
  613. }
  614. for (int j=0;j<2;j++)
  615. {
  616. for (int i=0; i<elso.size();i++)
  617. {
  618. Advheu_13(i, 's');
  619. }
  620. for (int i=0; i<masodik.size();i++)
  621. {
  622. Advheu_13(i, 'o');
  623. }
  624. }
  625.  
  626. /// COUT
  627. cout<<endl;
  628. /*for (int j=0;j<r.sy;j++){ cout<<endl<<" "<<r.masodik[j].fog<<endl;
  629. for (int i=0; i<r.masodik[j].inters.size();i++)
  630. {
  631. cout<<r.masodik[j].inters[i].hossz<<" "<<r.masodik[j].inters[i].egyesek<<" "<<r.masodik[j].inters[i].kezd<<" "<<r.masodik[j].inters[i].teli<<endl;
  632. }}*/
  633. for (int j=0; j<mo.size(); j++)
  634. {
  635. for (int i=0; i<mo[j].size(); i++) {if(mo[j][i]>=0) cout<<" "; cout<<mo[j][i]<<" ";}
  636. cout<<endl;
  637. //cout<<" "<<r.elso[j].bf0<<" "<<r.elso[j].ja0<<" "<<endl;
  638. }
  639. cout<<endl;
  640. /*for (int j=0;j<r.sx;j++){ cout<<endl<<" "<<r.elso[j].fog<<endl;
  641. for (int i=0; i<r.elso[j].inters.size();i++)
  642. {
  643. cout<<r.elso[j].inters[i].hossz<<" "<<r.elso[j].inters[i].egyesek<<" "<<r.elso[j].inters[i].kezd<<" "<<r.elso[j].inters[i].teli<<endl;
  644. }}*/
  645. //for (int j=0; j<mo[0].size(); j++) cout<<r.masodik[j].bf0<<" "<<r.masodik[j].ja0<<" ";
  646. }
  647.  
  648. int main()
  649. {
  650. Rejtveny r;
  651. r.Beolvas();
  652. r.Megoldas();
  653. return 0;
  654. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement