È˹¤ÖÇÄܶþ_Ò°È˹ýºÓÎÊÌâ_ʵÑé3. ÏÂÔØ±¾ÎÄ

{

int flag;

struct SPQ *ntx; /* Ìṩ½«ÒªÀ©Õ¹µÄ½áµãµÄÖ¸Õë */ for( ; ; ) {

ntx = unopened; /* ´Ó´ýÀ©Õ¹Á´±íÖÐÌáÈ¡×îÇ°ÃæµÄÒ»¸ö */ if(ntx->loop == maxloop) return 0;

addtoopened(ntx); /* ½«ntx¼ÓÈëÒÑÀ©Õ¹Á´±í£¬²¢½«Õâ¸ö½Úµã´Ó´ýÀ©Õ¹Á´±íÖÐÈ¥µô */

flag = stretch(ntx); /* ¶Ôntx½øÐÐÀ©Õ¹,·µ»Ø-1,0,1 */ if(flag == 1)

return 1; } }

int stretch(struct SPQ *ntx) {

int fsr , fpr ; /* ÔÚÓÒ°¶ÉϵÄÈËÊý */ int fsl , fpl ; /* ÔÚ×ó°¶ÉϵÄÈËÊý */

int sst , spt ; /* ³ö·¢Ê±ÔÚ´¬ÉϵÄÈËÊý */ int ssr , spr ; /* ·µ»ØÊ±´¬ÉϵÄÈËÊý */ struct SPQ *newnode;

for (sst = 0 ; sst <= 2 ; sst++) /* ÌÖÂÛ²»Í¬µÄ¿ÉÄÜÐÔ²¢ÅжÏÊÇ·ñ·ûºÏÌõ¼þ */ {

fsr = ntx -> sr; fpr = ntx -> pr; fsl = ntx -> sl; fpl = ntx -> pl;

if ((sst <= fsr) && (( 2 - sst) <= fpr))/* Âú×ãÈËÊýÏÞÖÆ */ {

spt = 2 - sst; fsr = fsr - sst; fpr = fpr - spt;

if((fpr == 0) && (fsr == 0))/* ËÑË÷³É¹¦ */ {

newnode = (struct SPQ*) malloc (sizeof(spq)); if(newnode==NULL) {

printf(\ÄÚ´æ²»¹»£¡\\n\ exit(0); }

newnode -> upnode = ntx; /* ±£´æ¸¸½áµãµÄµØÖ·ÒÔ³ÉÁ´±í */ newnode -> nextnode = NULL; newnode -> sr = 0;

newnode -> pr = 0;

newnode -> sl = opened -> sr; newnode -> pl = opened -> pr; newnode -> sst = sst; newnode -> spt = spt; newnode -> ssr = 0; newnode -> spr = 0;

newnode -> loop = ntx -> loop + 1; oend -> nextnode = newnode; oend = newnode; openednum++; return 1; }

else if ((fpr - fsr) * fpr >= 0) /* ÅжÏÊÇ·ñÂú×ã´«½ÌÊ¿ÈËÊý±ØÐë´óÓÚ»òµÈÓÚÒ°ÈËÈËÊý */ {

fsl = fsl + sst; fpl = fpl + spt;

for (ssr = 0 ; ssr <= 1 ; ssr++) /* ·µ»Ø */ {

int ffsl , ffpl;

if ((ssr <= fsl) && ((1 - ssr) <= fpl)) {

spr = 1 - ssr; ffsl = fsl - ssr; ffpl = fpl - spr;

if ((ffpl - ffsl) * ffpl >= 0)

{ /* Èô·ûºÏÌõ¼þÔò·ÖÅäÄÚ´æ²¢¸¶Öµ */ int ffsr , ffpr; ffsr = fsr + ssr;

ffpr = fpr + spr; newnode = (struct SPQ*) malloc (sizeof(spq)); if(newnode==NULL) {

printf(\ÄÚ´æ²»¹»£¡\\n\ exit(0); }

newnode -> upnode = ntx; /* ±£´æ¸¸½áµãµÄµØÖ·ÒÔ³ÉÁ´±í */

newnode -> sr = ffsr; newnode -> pr = ffpr; newnode -> sl = ffsl; newnode -> pl = ffpl; newnode -> sst = sst;

newnode -> spt = spt; newnode -> ssr = ssr; newnode -> spr = spr;

newnode -> loop = ntx -> loop + 1; uend -> nextnode = newnode; uend = newnode;

unopenednum++; } } } } } }

return 0; }

void addtoopened(struct SPQ *ntx) {

unopened = unopened -> nextnode; unopenednum--; if (openednum == 0 )

oend = opened = ntx; oend -> nextnode = ntx; oend = ntx; openednum++; }

void recorder() {

int i , loop;

struct SPQ *newnode; struct SPQ *ntx; loop = oend -> loop; ntx = oend; resultnum = 0;

for( i = 0 ; i <= loop ; i++ ) {

newnode = (struct SPQ*) malloc (sizeof(spq)); if(newnode==NULL) {

printf(\ÄÚ´æ²»¹»£¡\\n\ exit(0); }

newnode -> sr = ntx -> sr; newnode -> pr = ntx -> pr;

newnode -> sl = ntx -> sl; newnode -> pl = ntx -> pl; newnode -> sst = ntx -> sst; newnode -> spt = ntx -> spt; newnode -> ssr = ntx -> ssr; newnode -> spr = ntx -> spr; newnode -> nextnode = NULL; ntx = ntx -> upnode; if(i == 0)

result = newnode;

newnode -> nextnode = result; result = newnode; resultnum++; } }

void releasemem() {

int i;

struct SPQ* nodefree;

for ( i = 1 ; i < openednum ; i++ ) {

nodefree = opened;

opened = opened -> nextnode; free(nodefree); }

for ( i = 0 ; i < unopenednum ; i++ ) {

nodefree = unopened;

unopened = unopened -> nextnode; free(nodefree); } }

void showresult() {

int i;

int fsr , fpr ; /* ÔÚÓÒ°¶ÉϵÄÈËÊý */ int fsl , fpl ; /* ÔÚ×ó°¶ÉϵÄÈËÊý */ struct SPQ* nodefree;

printf(\¸ö´«½ÌÊ¿\ printf(\¸öÒ°ÈË\ printf(\¸ö´«½ÌÊ¿\ printf(\¸öÒ°ÈË\ for ( i = 1 ; i < resultnum ; i++ ) {