[问题]zerojudge竞赛题目b841:104北二5.骨牌游戏

楼主: vagrantlike (【杰克】喵呜)   2016-07-17 19:38:37
http://zerojudge.tw/ShowProblem?problemid=b841
对于递回题目真的是苦手 T.T
想要做的是迭代长方形每个格子点
从上下右左的顺序依次检查是否可连成骨牌
并递回产生所有的状态
再从中选择骨牌数最多者
遇到的问题是
1>某点有相邻相同数字可连成骨牌时如何不选择该点
保留给后面其他点有选择机会因也许能产生更多骨牌
2>递回终止条件设定也有问题...
3>目前写法仔细想想根本不是递回
能否提供建议或想法?谢谢
///////////////////////
以下是我的程式码
//////////////////////
#include <stdio.h>
#include <stdlib.h>
int H = 0,W = 0;
int board[6][6] = {0};
#include <stdio.h>
#include <stdlib.h>
int H = 0,W = 0;
int board[6][6] = {0};
//-2:初始值;0:先前曾有机会选择但放弃未选;-1:已被其他相邻格子选择过;
int flag[6][6] = {-2};
int maxN = -987654321,cnt = 0;
int main() {
int i=0,j = 0;
while(scanf("%d %d",&H,&W)==2) {
memset(flag,-2,sizeof(flag));
for(i=0; i<H; ++i) {
for(j=0; j<W; ++j) {
scanf("%d",&board[i][j]);
}
}
for(i=0; i<H; ++i) {
for(j=0; j<W; ++j) {
if(flag[i][j]!=-1) {
dfs(i,j,&cnt);
}
}
}
printf("%d\n",cnt);
}
return 0;
}
int dfs(int x, int y,int *id) {
int i =0,j = 0;
// 终止条件
if(x==H-1 && y==W-1) {
if(*id>maxN)
maxN = *id;
return;
} else {
if(flag[x][y]!=-1) {
//上,右,下,左
//?不选?
if(board[x-1][y]==board[x][y] && flag[x-1][y]!=-1) {
//选择他
flag[x][y] = flag[x-1][y] = -1;
++*id;
dfs(x-1,y,*id);
//不选择他
//flag[x][y] = flag[x-1][y] = 0;
//dfs(x-1,y,
作者: FRAXIS (喔喔)   2016-07-18 08:33:00
你给的题目连结不能点..
作者: yvb   2016-07-19 14:11:00
网址最后的 problemid=b8 应改为 problemid=b841
楼主: vagrantlike (【杰克】喵呜)   2016-07-19 22:52:00
感谢 连结已修正‘
作者: chchwy (mat)   2016-07-20 08:53:00
考虑用 https://paste.plurk.com/ 来贴长段code吧
作者: yr (Sooner Born Sooner Bred)   2016-07-20 21:55:00
先把数字区块找出来再去递回找出该区块可以有几组如何?size = 2,3 就不用算了
楼主: vagrantlike (【杰克】喵呜)   2016-07-21 21:39:00
to yr:有思考过你提的这种方式 就是典型DFS找范围内有几块油田题目的变形 只是这时同一块油田有相同数字 应该是可行的to chchwy:这段程式码其实尚未完成 只是想用来记录目前想到的解法 他是无法执行的。。。
作者: yr (Sooner Born Sooner Bred)   2016-07-21 22:42:00
不知道我是不是想得太复杂,区块可以转成 graph然后相当于要找该 graph 的 maximum matchingO(V^2 * E)
楼主: vagrantlike (【杰克】喵呜)   2016-07-21 23:23:00
刚搜寻graph 的 maximum matching 似乎是可行的但有杀鸡焉用牛刀的感觉 直觉有更简单的思路可解...http://www.csie.ntnu.edu.tw/~u91029/Matching.html
作者: FRAXIS (喔喔)   2016-07-22 08:36:00
这个图是 bipartite 的 所以应该很容易算maximum matching
作者: yr (Sooner Born Sooner Bred)   2016-07-22 10:06:00
嗯嗯,没发现是 bipartite ,这样就好解很多研究了一下,跑个 bfs 算奇数层跟偶数层的点数量,取小的这算法不知道有没忽略特殊情况?实作 http://pastebin.com/75a9Tm3n 只测过网页那个
作者: FRAXIS (喔喔)   2016-07-22 22:22:00
bipartite maximum matching 应该是用 network flow 吧...
作者: yr (Sooner Born Sooner Bred)   2016-07-22 22:46:00
因为只要算数量, bipartite maximum matching 相当于minimum size of a vertex cover ,因为 graph 特性关系,似乎可以直接用 bfs 去求graph 特性是指本题产生的 graph查了一下,一般是解西洋棋棋盘拿掉部分,连着的区块可以完全覆蓋要偶数格跟黑白格数一样多
作者: FRAXIS (喔喔)   2016-07-23 11:24:00
但是这题有要完全覆蓋吗?
作者: yr (Sooner Born Sooner Bred)   2016-07-23 11:44:00
我的想法是,可以覆蓋的组数跟颜色少的格子一样多,不知道这想法正不正确似乎可以用 Hall's theorem 来证明
作者: FRAXIS (喔喔)   2016-07-23 12:13:00
你有没有试着找找反例?
作者: yllan (蓝永伦)   2016-07-24 13:10:00
这题最大只有6x6,原po可能想问最基本的暴力法吧~

Links booklink

Contact Us: admin [ a t ] ucptt.com