日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVA 11210 Chinese Mahjong

發布時間:2024/4/11 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVA 11210 Chinese Mahjong 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

UVA_11210

一開始覺得這個題目比較麻煩便有點膽怯,后來鼓起勇氣開始編之后,發現其實只要把每種情況考慮周全并且回溯得當的話還是不難的。

深搜中間之所以把eye設成全局變量并且放在return語句后面進行回溯,是因為我們大體可以把牌分4類,4類中最多只有一個eye,并且如果當前某一類在占用一個eye之后使這一類成為了符合要求的牌,那么這一類不占一個eye的話就一定是不符合要求的(這類牌的張數決定的)。

我的程序里面的prepare()函數是可以不用的,當時為了刷排名才刻意加了一個這樣的函數。

另外,不知道外國人看到劉汝佳的下面這句話時,不知道會不會求助于Google呢……

??? To who knows more about Mahjong: don’t consider special winning hands such as ‘七對子’.

#include<stdio.h>
#include
<string.h>
#include
<ctype.h>
int p[3][15],f[10],eye;
char ap[]={'T','S','W'},b[10];
char af[][10]={"DONG","NAN","XI","BEI","ZHONG","FA","BAI"};
int dfs_f(int cur,int e)
{
int i,ok;
for(i=cur;f[i]==0&&i<7;i++);
if(i==7)
return 1;
if(f[i]==4)
return 0;
if(f[i]==3)
{
f[i]
-=3;
ok
=dfs_f(i,e);
f[i]
+=3;
if(ok)
return 1;
}
else if(f[i]==2)
{
if(e)
return 0;
else
{
f[i]
-=2;
eye
=1;
ok
=dfs_f(i,eye);
f[i]
+=2;
if(ok)
return 1;
eye
=0;
}
}
return 0;
}
int dfs_p(int s,int cur,int e)
{
int i,j,ok;
for(i=cur;p[s][i]==0&&i<9;i++);
if(i==9)
return 1;
if(p[s][i]>=3)
{
p[s][i]
-=3;
ok
=dfs_p(s,i,e);
p[s][i]
+=3;
if(ok)
return 1;
}
if(p[s][i]>=2&&!e)
{
p[s][i]
-=2;
eye
=1;
ok
=dfs_p(s,i,eye);
p[s][i]
+=2;
if(ok)
return 1;
eye
=0;
}
if(i<7&&p[s][i+1]&&p[s][i+2])
{
p[s][i]
-=1;
p[s][i
+1]-=1;
p[s][i
+2]-=1;
ok
=dfs_p(s,i,e);
p[s][i]
+=1;
p[s][i
+1]+=1;
p[s][i
+2]+=1;
if(ok)
return 1;
}
return 0;
}
int judge()
{
int i,eye=0;
if(!dfs_f(0,eye))
return 0;
for(i=0;i<3;i++)
if(!dfs_p(i,0,eye))
return 0;
return 1;
}
int init()
{
int i,j,k;
for(i=0;i<13;i++)
{
scanf(
"%s",b);
if(b[0]=='0')
return 0;
if(isdigit(b[0]))
{
k
=b[0]-'1';
for(j=0;;j++)
if(ap[j]==b[1])
break;
p[j][k]
++;
}
else
{
for(j=0;;j++)
if(strcmp(af[j],b)==0)
break;
f[j]
++;
}
}
return 1;
}
int prepare()
{
int i,j;
for(i=0;i<7;i++)
if(f[i]==4||f[i]==1)
return 0;
for(i=0;i<3;i++)
for(j=0;j<9;j++)
if(p[i][j]==1)
{
if(j==0)
{
if(!p[i][j+1])
return 0;
}
else if(j==8)
{
if(!p[i][j-1])
return 0;
}
else
{
if(!p[i][j-1]&&!p[i][j+1])
return 0;
}
}
return 1;
}
int main()
{
int i,j,k,t,ok;
t
=0;
while(1)
{
memset(p,
0,sizeof(p));
memset(f,
0,sizeof(f));
if(!init())
break;
printf(
"Case %d:",++t);
ok
=0;
for(i=0;i<3;i++)
for(j=0;j<9;j++)
if(p[i][j]!=4)
{
p[i][j]
++;
if(prepare()&&judge())
{
ok
=1;
printf(
" %d%c",j+1,ap[i]);
}
p[i][j]
--;
}
for(i=0;i<7;i++)
if(f[i]!=4)
{
f[i]
++;
if(prepare()&&judge())
{
ok
=1;
printf(
" %s",af[i]);
}
f[i]
--;
}
if(!ok)
printf(
" Not ready\n");
else
printf(
"\n");
}
return 0;
}

  

總結

以上是生活随笔為你收集整理的UVA 11210 Chinese Mahjong的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。