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,