#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BOX_NUM 2
#define HISTORY_NUM_MAX 1024
typedef struct
{
int capacity, volume;
}box_t;
typedef struct
{
box_t box[BOX_NUM];
int times;
int parent;
}state_t;
state_t history[HISTORY_NUM_MAX];
int history_num=0;
void history_clear(void)
{
memset(history
, -1, sizeof(history
)); history_num=0;
}
int history_search(state_t *p)
{
int i;
for(i=0;i<history_num;i++)
{
if(memcmp(&history
[i
], p
, sizeof(history
[i
].
box))==0) return i
; }
return -1;
}
void history_add(state_t *p, int parent)
{
if(history_search(p)>=0) return;
if(history_num>=HISTORY_NUM_MAX)
{
printf("\nERROR : overflow\n"); }
p->parent=parent;
if(parent>=0)
{
p->times=history[parent].times+1;
}
else
{
p->times=0;
}
history[history_num++]=*p;
}
void box_fill(box_t *p)
{
p->volume=p->capacity;
}
void box_empty(box_t *p)
{
p->volume=0;
}
void box2box(box_t *to, box_t *from)
{
int volume1, volume2, move_volume;
volume1=from->volume;
volume2=to->capacity-to->volume;
if(volume1<volume2) move_volume=volume1;
else move_volume=volume2;
to->volume+=move_volume;
from->volume-=move_volume;
}
int solve(void)
{
state_t work;
int i, j, k;
for(i=0;i<history_num;i++)
{
if(history[i].box[0].volume==2 && history[i].box[1].volume==0) return i;
for(j=0;j<BOX_NUM;j++)
{
work=history[i]; box_fill(&(work.box[j])); history_add(&work, i);
work=history[i]; box_empty(&(work.box[j])); history_add(&work, i);
for(k=0;k<BOX_NUM;k++)
{
if(j==k) continue;
work=history[i]; box2box(&(work.box[j]), &(work.box[k])); history_add(&work, i);
}
}
}
}
void state_print(state_t *p)
{
int i, goukei=0;
for(i=0;i<BOX_NUM;i++)
{
goukei+=p->box[i].volume;
printf("%dL=%d,", p
->box
[i
].
capacity, p
->box
[i
].
volume); }
printf("Goukei=%d\n", goukei
); }
void result_print(int index)
{
if(index<0) return;
result_print(history[index].parent);
state_print(&history[index]);
}
int main(void)
{
state_t initial={{{4,0},{3,0}}};
int i, result;
history_clear();
history_add(&initial, -1);
result=solve();
result_print(result);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKCiNkZWZpbmUgQk9YX05VTSAyCiNkZWZpbmUgSElTVE9SWV9OVU1fTUFYIDEwMjQKCgp0eXBlZGVmIHN0cnVjdAp7CglpbnQgY2FwYWNpdHksIHZvbHVtZTsKfWJveF90OwoKCnR5cGVkZWYgc3RydWN0CnsKCWJveF90IGJveFtCT1hfTlVNXTsKCWludCB0aW1lczsKCWludCBwYXJlbnQ7Cn1zdGF0ZV90OwoKCnN0YXRlX3QgaGlzdG9yeVtISVNUT1JZX05VTV9NQVhdOwppbnQgaGlzdG9yeV9udW09MDsKCgp2b2lkIGhpc3RvcnlfY2xlYXIodm9pZCkKewoJbWVtc2V0KGhpc3RvcnksIC0xLCBzaXplb2YoaGlzdG9yeSkpOwoJaGlzdG9yeV9udW09MDsKfQoKCmludCBoaXN0b3J5X3NlYXJjaChzdGF0ZV90ICpwKQp7CglpbnQgaTsKCglmb3IoaT0wO2k8aGlzdG9yeV9udW07aSsrKQoJewoJCWlmKG1lbWNtcCgmaGlzdG9yeVtpXSwgcCwgc2l6ZW9mKGhpc3RvcnlbaV0uYm94KSk9PTApIHJldHVybiBpOwoJfQoJcmV0dXJuIC0xOwp9CgoKdm9pZCBoaXN0b3J5X2FkZChzdGF0ZV90ICpwLCBpbnQgcGFyZW50KQp7CglpZihoaXN0b3J5X3NlYXJjaChwKT49MCkgcmV0dXJuOwoKCWlmKGhpc3RvcnlfbnVtPj1ISVNUT1JZX05VTV9NQVgpCgl7CgkJcHJpbnRmKCJcbkVSUk9SIDogb3ZlcmZsb3dcbiIpOwoJCWV4aXQoMSk7Cgl9CglwLT5wYXJlbnQ9cGFyZW50OwoJaWYocGFyZW50Pj0wKQoJewoJCXAtPnRpbWVzPWhpc3RvcnlbcGFyZW50XS50aW1lcysxOwoJfQoJZWxzZQoJewoJCXAtPnRpbWVzPTA7Cgl9CgloaXN0b3J5W2hpc3RvcnlfbnVtKytdPSpwOwp9CgoKdm9pZCBib3hfZmlsbChib3hfdCAqcCkKewoJcC0+dm9sdW1lPXAtPmNhcGFjaXR5Owp9CgoKdm9pZCBib3hfZW1wdHkoYm94X3QgKnApCnsKCXAtPnZvbHVtZT0wOwp9CgoKdm9pZCBib3gyYm94KGJveF90ICp0bywgYm94X3QgKmZyb20pCnsKCWludCB2b2x1bWUxLCB2b2x1bWUyLCBtb3ZlX3ZvbHVtZTsKCgl2b2x1bWUxPWZyb20tPnZvbHVtZTsKCXZvbHVtZTI9dG8tPmNhcGFjaXR5LXRvLT52b2x1bWU7CgoJaWYodm9sdW1lMTx2b2x1bWUyKSBtb3ZlX3ZvbHVtZT12b2x1bWUxOwoJZWxzZSBtb3ZlX3ZvbHVtZT12b2x1bWUyOwoKCXRvLT52b2x1bWUrPW1vdmVfdm9sdW1lOwoJZnJvbS0+dm9sdW1lLT1tb3ZlX3ZvbHVtZTsKfQoKCmludCBzb2x2ZSh2b2lkKQp7CglzdGF0ZV90IHdvcms7CglpbnQgaSwgaiwgazsKCglmb3IoaT0wO2k8aGlzdG9yeV9udW07aSsrKQoJewoJCWlmKGhpc3RvcnlbaV0uYm94WzBdLnZvbHVtZT09MiAmJiBoaXN0b3J5W2ldLmJveFsxXS52b2x1bWU9PTApIHJldHVybiBpOwoJCWZvcihqPTA7ajxCT1hfTlVNO2orKykKCQl7CgkJCXdvcms9aGlzdG9yeVtpXTsgYm94X2ZpbGwoJih3b3JrLmJveFtqXSkpOyBoaXN0b3J5X2FkZCgmd29yaywgaSk7CgkJCXdvcms9aGlzdG9yeVtpXTsgYm94X2VtcHR5KCYod29yay5ib3hbal0pKTsgaGlzdG9yeV9hZGQoJndvcmssIGkpOwoKCQkJZm9yKGs9MDtrPEJPWF9OVU07aysrKQoJCQl7CgkJCQlpZihqPT1rKSBjb250aW51ZTsKCQkJCXdvcms9aGlzdG9yeVtpXTsgYm94MmJveCgmKHdvcmsuYm94W2pdKSwgJih3b3JrLmJveFtrXSkpOyBoaXN0b3J5X2FkZCgmd29yaywgaSk7CgkJCX0KCQl9Cgl9Cn0KCgp2b2lkIHN0YXRlX3ByaW50KHN0YXRlX3QgKnApCnsKCWludCBpLCBnb3VrZWk9MDsKCglmb3IoaT0wO2k8Qk9YX05VTTtpKyspCgl7CgkJZ291a2VpKz1wLT5ib3hbaV0udm9sdW1lOwoJCXByaW50ZigiJWRMPSVkLCIsIHAtPmJveFtpXS5jYXBhY2l0eSwgcC0+Ym94W2ldLnZvbHVtZSk7Cgl9CglwcmludGYoIkdvdWtlaT0lZFxuIiwgZ291a2VpKTsKfQoKCnZvaWQgcmVzdWx0X3ByaW50KGludCBpbmRleCkKewoJaWYoaW5kZXg8MCkgcmV0dXJuOwoKCXJlc3VsdF9wcmludChoaXN0b3J5W2luZGV4XS5wYXJlbnQpOwoJc3RhdGVfcHJpbnQoJmhpc3RvcnlbaW5kZXhdKTsKfQoKCmludCBtYWluKHZvaWQpCnsKCXN0YXRlX3QgaW5pdGlhbD17e3s0LDB9LHszLDB9fX07CglpbnQgaSwgcmVzdWx0OwoKCWhpc3RvcnlfY2xlYXIoKTsKCWhpc3RvcnlfYWRkKCZpbml0aWFsLCAtMSk7CglyZXN1bHQ9c29sdmUoKTsKCglyZXN1bHRfcHJpbnQocmVzdWx0KTsKCXJldHVybiAwOwp9Cg==
4L=0,3L=0,Goukei=0
4L=0,3L=3,Goukei=3
4L=3,3L=0,Goukei=3
4L=3,3L=3,Goukei=6
4L=4,3L=2,Goukei=6
4L=0,3L=2,Goukei=2
4L=2,3L=0,Goukei=2