TYVJ P1092 麻将
题目:
http://tyvj.cn/Problem_Show.asp?id=1092
题解:
不解释………………自己去看代码吧……………………
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 5 using namespace std; 6 7 int num[10][20],num2[10][20],t; 8 9 char s[40]; 10 11 bool dfs(int now) 12 { 13 if (now==5) 14 { 15 for (int a=1;a<=3;a++) 16 for (int b=1;b<=9;b++) 17 if (num[a][b]!=0) 18 { 19 if (num[a][b]!=2) return false; 20 } 21 return true; 22 } 23 for (int a=1;a<=3;a++) 24 for (int b=1;b<=9;b++) 25 if (num[a][b]!=0) 26 { 27 if (num[a][b+1]!=0 && num[a][b+2]!=0) 28 { 29 num[a][b]--; 30 num[a][b+1]--; 31 num[a][b+2]--; 32 if (dfs(now+1)) 33 { 34 num[a][b]++; 35 num[a][b+1]++; 36 num[a][b+2]++; 37 return true; 38 } 39 num[a][b]++; 40 num[a][b+1]++; 41 num[a][b+2]++; 42 } 43 if (num[a][b]>=3) 44 { 45 num[a][b]-=3; 46 if (dfs(now+1)) 47 { 48 num[a][b]+=3; 49 return true; 50 } 51 num[a][b]+=3; 52 } 53 } 54 return false; 55 } 56 57 bool check()//检查是否能和 58 { 59 return dfs(1); 60 } 61 62 int work1()//平和(一番):4个顺子组成 63 { 64 for (int a=1;a<=3;a++) 65 for (int b=1;b<=9;b++) 66 if (num[a][b]>=2) 67 { 68 for (int c=1;c<=3;c++) 69 for (int d=1;d<=9;d++) 70 num2[c][d]=num[c][d]; 71 num2[a][b]-=2; 72 bool able=true; 73 for (int c=1;c<=3;c++) 74 { 75 if (!able) break; 76 for (int d=1;d<=9;d++) 77 if (num2[c][d]!=0) 78 { 79 if (num2[c][d+1]==0 || num2[c][d+2]==0) 80 { 81 able=false; 82 break; 83 } 84 num2[c][d]--; 85 num2[c][d+1]--; 86 num2[c][d+2]--; 87 d--; 88 } 89 } 90 if (able) return 1; 91 } 92 return 0; 93 } 94 95 int work2()//断幺九(一番):胡牌的时候手上只有2-8的数字组成的牌型 96 { 97 if (num[1][1] || num[2][1] || num[3][1] || num[1][9] || num[2][9] || num[3][9]) return 0; 98 else return 1; 99 } 100 101 int work3()//一杯口(一番):同花色同数值的顺子两组 102 { 103 for (int a=1;a<=3;a++) 104 for (int b=1;b<=9;b++) 105 if (num[a][b]>=2) 106 { 107 for (int c=1;c<=3;c++) 108 for (int d=1;d<=9;d++) 109 num2[c][d]=num[c][d]; 110 num2[a][b]-=2; 111 bool able=true; 112 for (int c=1;c<=3;c++) 113 { 114 if (!able) break; 115 for (int d=1;d<=9;d++) 116 if (num2[c][d]!=0) 117 { 118 if (num2[c][d]>=2 && num2[c][d+1]>=2 && num2[c][d+2]>=2) return 1; 119 if (num2[c][d+1]==0 || num2[c][d+2]==0) 120 { 121 able=false; 122 break; 123 } 124 num2[c][d]--; 125 num2[c][d+1]--; 126 num2[c][d+2]--; 127 d--; 128 } 129 } 130 } 131 return 0; 132 } 133 134 bool dfs2(int now) 135 { 136 if (now==5) return true; 137 for (int a=1;a<=3;a++) 138 for (int b=1;b<=9;b++) 139 if (num2[a][b]!=0) 140 { 141 if (num2[a][b+1]!=0 && num2[a][b+2]!=0 && (b==1 || b+2==9)) 142 { 143 num2[a][b]--; 144 num2[a][b+1]--; 145 num2[a][b+2]--; 146 if (dfs2(now+1)) return true; 147 num2[a][b]++; 148 num2[a][b+1]++; 149 num2[a][b+2]++; 150 } 151 if (num2[a][b]>=3 && (b==1 || b==9)) 152 { 153 num2[a][b]-=3; 154 if (dfs2(now+1)) return true; 155 num2[a][b]+=3; 156 } 157 } 158 return false; 159 } 160 161 int work4()//混全带幺九(一番):全部的顺子,刻子中都含有数字1或9 162 { 163 for (int a=1;a<=3;a++) 164 for (int b=1;b<=9;b++) 165 if (num[a][b]>=2) 166 { 167 for (int c=1;c<=3;c++) 168 for (int d=1;d<=9;d++) 169 num2[c][d]=num[c][d]; 170 num2[a][b]-=2; 171 if (dfs2(1)) return 1; 172 } 173 return 0; 174 } 175 176 int work5()//三色同顺(一番):三种花色同数值的顺子各一组 177 { 178 for (int a=1;a<=3;a++) 179 for (int b=1;b<=9;b++) 180 if (num[a][b]>=2) 181 { 182 for (int c=1;c<=3;c++) 183 for (int d=1;d<=9;d++) 184 num2[c][d]=num[c][d]; 185 num2[a][b]-=2; 186 for (int c=1;c<=9;c++) 187 if (num2[1][c] && num2[2][c] && num2[3][c] && num2[1][c+1] && num2[2][c+1] && num2[3][c+1] && num2[1][c+2] && num2[2][c+2] && num2[3][c+2]) 188 { 189 num2[1][c]--;num2[1][c+1]--;num2[1][c+2]--; 190 num2[2][c]--;num2[2][c+1]--;num2[2][c+2]--; 191 num2[3][c]--;num2[3][c+1]--;num2[3][c+2]--; 192 bool able,find=false; 193 for (int c=1;c<=3;c++) 194 { 195 if (find) break; 196 for (int d=1;d<=9;d++) 197 if (num2[c][d]!=0) 198 { 199 find=true; 200 if (num2[c][d]==3) able=true; 201 else 202 { 203 if (num2[c][d]==1 && num2[c][d+1]==1 && num2[c][d+2]==1) able=true; 204 else able=false; 205 } 206 break; 207 } 208 } 209 if (able) return 1; 210 } 211 } 212 return 0; 213 } 214 215 int work6()//一气贯通(一番):由同花色一至九组成顺子 216 { 217 for (int a=1;a<=3;a++) 218 for (int b=1;b<=9;b++) 219 if (num[a][b]>=2) 220 { 221 for (int c=1;c<=3;c++) 222 for (int d=1;d<=9;d++) 223 num2[c][d]=num[c][d]; 224 num2[a][b]-=2; 225 for (int c=1;c<=3;c++) 226 if (num2[c][1] && num2[c][2] && num2[c][3] && num2[c][4] && num2[c][5] && num2[c][6] && num2[c][7] && num2[c][8] && num2[c][9]) 227 { 228 num2[c][1]--; 229 num2[c][2]--; 230 num2[c][3]--; 231 num2[c][4]--; 232 num2[c][5]--; 233 num2[c][6]--; 234 num2[c][7]--; 235 num2[c][8]--; 236 num2[c][9]--; 237 bool able=false,find=false; 238 for (int d=1;d<=3;d++) 239 { 240 if (find) break; 241 for (int e=1;e<=9;e++) 242 if (num2[d][e]!=0) 243 { 244 find=true; 245 if (num2[d][e]==3) able=true; 246 else 247 { 248 if (num2[d][e+1]==1 && num2[d][e+2]==1) able=true; 249 else able=false; 250 } 251 break; 252 } 253 } 254 if (able) return 1; 255 } 256 } 257 return 0; 258 } 259 260 int work7()//一色三顺(两番):同花色同数值顺子三组 261 { 262 for (int a=1;a<=3;a++) 263 for (int b=1;b<=9;b++) 264 if (num[a][b]>=2) 265 { 266 for (int c=1;c<=3;c++) 267 for (int d=1;d<=9;d++) 268 num2[c][d]=num[c][d]; 269 num2[a][b]-=2; 270 for (int c=1;c<=3;c++) 271 for (int d=1;d<=9;d++) 272 if (num2[c][d]>=3 && num2[c][d+1]>=3 && num2[c][d+2]>=3) 273 { 274 num2[c][d]-=3; 275 num2[c][d+1]-=3; 276 num2[c][d+2]-=3; 277 bool able=false,find=false; 278 for (int d=1;d<=3;d++) 279 { 280 if (find) break; 281 for (int e=1;e<=9;e++) 282 if (num2[d][e]!=0) 283 { 284 find=true; 285 if (num2[d][e]==3) able=true; 286 else 287 { 288 if (num2[d][e+1]==1 && num2[d][e+2]==1) able=true; 289 else able=false; 290 } 291 break; 292 } 293 } 294 if (able) return 2; 295 } 296 } 297 return 0; 298 } 299 300 int work8()//对对和(两番):四组刻子 301 { 302 for (int a=1;a<=3;a++) 303 for (int b=1;b<=9;b++) 304 if (num[a][b]>=2) 305 { 306 for (int c=1;c<=3;c++) 307 for (int d=1;d<=9;d++) 308 num2[c][d]=num[c][d]; 309 num2[a][b]-=2; 310 bool able=true; 311 for (int c=1;c<=3;c++) 312 for (int d=1;d<=9;d++) 313 if (num2[c][d]!=0) 314 { 315 if (num2[c][d]!=3) able=false; 316 } 317 if (able) return 2; 318 } 319 return 0; 320 } 321 322 int work9()//两杯口(三番):由两组不同的一杯口组成 323 { 324 for (int a=1;a<=3;a++) 325 for (int b=1;b<=9;b++) 326 if (num[a][b]>=2) 327 { 328 for (int c=1;c<=3;c++) 329 for (int d=1;d<=9;d++) 330 num2[c][d]=num[c][d]; 331 num2[a][b]-=2; 332 bool able=true,find=false; 333 for (int c=1;c<=3;c++) 334 { 335 if (find) break; 336 for (int d=1;d<=9;d++) 337 if (num2[c][d]!=0) 338 { 339 find=true; 340 if (num2[c][d]<2 || num2[c][d+1]<2 || num2[c][d+2]<2) 341 { 342 able=false; 343 break; 344 } 345 else 346 { 347 num2[c][d]-=2; 348 num2[c][d+1]-=2; 349 num2[c][d+2]-=2; 350 bool find=false; 351 for (int e=1;e<=3;e++) 352 { 353 if (find) break; 354 for (int f=1;f<=9;f++) 355 if (num2[e][f]!=0) 356 { 357 find=true; 358 if (e==c && f==d) 359 { 360 able=false; 361 break; 362 } 363 if (num2[e][f]!=2 || num2[e][f+1]!=2 || num2[e][f+2]!=2) able=false; 364 break; 365 } 366 } 367 break; 368 } 369 } 370 } 371 if (able) return 3; 372 } 373 return 0; 374 } 375 376 int work10()//三色同刻(三番):三种花色同数值的刻子各一组 377 { 378 for (int a=1;a<=3;a++) 379 for (int b=1;b<=9;b++) 380 if (num[a][b]>=2) 381 { 382 for (int c=1;c<=3;c++) 383 for (int d=1;d<=9;d++) 384 num2[c][d]=num[c][d]; 385 num2[a][b]-=2; 386 for (int c=1;c<=9;c++) 387 if (num2[1][c]>=3 && num2[2][c]>=3 && num2[3][c]>=3) 388 { 389 num2[1][c]-=3; 390 num2[2][c]-=3; 391 num2[3][c]-=3; 392 bool able=false,find=false; 393 for (int d=1;d<=3;d++) 394 { 395 if (find) break; 396 for (int e=1;e<=9;e++) 397 if (num2[d][e]!=0) 398 { 399 find=true; 400 if (num2[d][e]==3) able=true; 401 else 402 { 403 if (num2[d][e+1]==1 && num2[d][e+2]==1) able=true; 404 else able=false; 405 } 406 break; 407 } 408 } 409 if (able) return 3; 410 } 411 } 412 return 0; 413 } 414 415 int work11()//清一色(六番):全部由同一种花色的顺子,刻子及雀头组成 416 { 417 for (int a=1;a<=3;a++) 418 { 419 int nowsum=0; 420 for (int b=1;b<=9;b++) 421 nowsum+=num[a][b]; 422 if (nowsum==14) return 6; 423 } 424 return 0; 425 } 426 427 int work12()//清老头(六番):全部由1或9的刻子和雀头组成 428 { 429 for (int a=1;a<=3;a++) 430 for (int b=2;b<=8;b++) 431 if (num[a][b]) return 0; 432 return 6; 433 } 434 435 int main() 436 { 437 scanf("%d",&t); 438 for (int a=1;a<=t;a++) 439 { 440 scanf("%s",s+1); 441 memset(num,0,sizeof(num)); 442 for (int a=1;a<=14;a++) 443 { 444 switch(s[a*2]) 445 { 446 case 'w': 447 { 448 num[1][s[a*2-1]-'0']++; 449 break; 450 } 451 case 's': 452 { 453 num[2][s[a*2-1]-'0']++; 454 break; 455 } 456 case 't': 457 { 458 num[3][s[a*2-1]-'0']++; 459 break; 460 } 461 } 462 } 463 if (!check())//检查是否能和 464 { 465 printf("0\n"); 466 continue; 467 } 468 int ans=0; 469 ans+=work1();//平和(一番):4个顺子组成 470 ans+=work2();//断幺九(一番):胡牌的时候手上只有2-8的数字组成的牌型 471 ans+=work3();//一杯口(一番):同花色同数值的顺子两组 472 ans+=work4();//混全带幺九(一番):全部的顺子,刻子中都含有数字1或9 473 ans+=work5();//三色同顺(一番):三种花色同数值的顺子各一组 474 ans+=work6();//一气贯通(一番):由同花色一至九组成顺子 475 ans+=work7();//一色三顺(两番):同花色同数值顺子三组 476 ans+=work8();//对对和(两番):四组刻子 477 ans+=work9();//两杯口(三番):由两组不同的一杯口组成 478 ans+=work10();//三色同刻(三番):三种花色同数值的刻子各一组 479 ans+=work11();//清一色(六番):全部由同一种花色的顺子,刻子及雀头组成 480 ans+=work12();//清老头(六番):全部由1或9的刻子和雀头组成 481 printf("%d\n",ans); 482 } 483 return 0; 484 }
转载于:https://www.cnblogs.com/zhonghaoxi/archive/2012/07/10/2584064.html
TYVJ P1092 麻将相关推荐
- 微软麻将AI Suphx或引入“凤凰房”,与其他AI对打
作者 | 夕颜 出品 | AI科技大本营(ID:rgznai100) [导读]在刚刚结束的上海2019世界人工智能大会上,微软宣布了其在人工智能领域的最新研究突破--由微软亚洲研究院研发的麻将 AI ...
- 超越99.9%人类玩家,微软专业十段麻将AI论文细节首次公布
视学算法分享 转自 | 机器之心 [导读]在去年 8 月底的世界人工智能大会上,时任微软全球执行副总裁的沈向洋正式对外宣布了微软亚洲研究院研发的麻将 AI「Suphx 」.近日,关于 Suph ...
- node.js——麻将算法(六)简易版麻将出牌AI1.0
普通麻将的出牌AI如果不是要求特别高的话,其实蛮容易实现的,毕竟大多数人打牌都只是看自己的手牌. 所以作为简易版的AI,出牌的策略只要奔着胡牌去就可以了.我们能想到的就是把相邻或相同的牌凑到一起,把单 ...
- node.js——麻将算法(一)基本判胡
首先带来的就是麻将胡牌.听牌的算法,不过大家都知道,麻将各个地方的规则都不同,所以相关算法也需要作出一定的调整. 先简单说一下本次demo的规则要求把. 1.不计番,也就是没那么多胡法,最后胡了就行. ...
- 做三年地方网站不如别人打一场麻将
做网站三年了,坚持了三年,也宅了三年. 三年前,看到这个40万人口的县城,没有个像样的门户网站和论坛,真是太不像话.像我这样的技术出身,又能够花极大的精力去运营的本地人,不做本地门户网站,人民都不答应 ...
- TYVJ P1080 N皇后 Label:dfs PS:以前做的一道题,贴出来防忘
描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 5来描 ...
- 我玩《王者荣耀》、斗地主、打麻将,但我是正经搞AI的北大教授
金磊 梦晨 发自 凹非寺 量子位 报道 | 公众号 QbitAI 一位导师下载好了<王者荣耀>,还鼓励她的博士生们去玩一玩. 真的很难想象,这种"名场面"就真真儿的发生 ...
- 【题解】Luogu P5279 [ZJOI2019]麻将
原题传送门 希望这题不会让你对麻将的热爱消失殆尽 我们珂以统计每种牌出现的次数,不需要统计是第几张牌 判一副牌能不能和,类似这道题 对于这题: 设\(f[i][j][k][0/1]\)表示前\(i\) ...
- |Tyvj|动态规划|P1004 滑雪
http://tyvj.cn/p/1004 由于考虑高度问题,确保每个值都算出来,这里用的是记忆化搜索. #include<cstdio> #include<cstring> ...
最新文章
- Python基础学习笔记--字符串、列表
- GifCam:最佳免费gif动画精细录制/剪辑软件
- 软设考试笔记--数据库系统
- 计算机在气象上的应用浅论,简析计算机网络在气象服务中的应用原稿
- Mac开发环境配置 就喜欢折腾
- 技术干货 | 为高音质保驾护航 - 通信中的回声消除
- python3连接mysql获取ansible动态inventory
- Pythonamp;R爬取分析赶集网北京二手房数据(附详细代码)
- 【python|opencv】读取/保存图片,路径含有中文问题解放方案(opencv 无法读取/保存图片)
- LINUX上开发ffmpeg程序,查看链接的库
- sqlalchemy的基本操作大全
- 颜色空间的几种表示方法
- Chrome浏览器更新失败
- vue中当图片地址无效的时候,显示默认图片
- 义乌中学集训(没打的题慢慢补)
- cadence软件用于高分屏笔记本时候显示字体模糊问题解决
- 参加python全栈开发培训需要多少钱?
- docker | 基于 WSL2 在 Windows 下使用 docker
- 三菱FX3U PLC模拟量输出FB (FX2N-4DA)
- firefox html 拖拽打开网页,Firefox Crash 0Day 一个html网页让你的火狐浏览器崩溃