黑白棋_lduoj_dfs深搜

Description

Lagno是一种二人智力游戏。游戏设有一个黑方和一个白方。游戏桌面是正方形的,包含8行8列。

如果黑方玩家走出这样一步棋:将一枚黑子放在任一空格上,而在这个空格的八个方向(上、下、左、右和4个对角线方向)的至少一个方向上有一排白子被夹在这枚新下的黑子和其他黑子之间,任何方向,在新黑子和原来黑子之间的所有白子都要变成黑子。为这个游戏设计一个程序,计算一步棋中黑方能转变的白子数量的最大值。

Input

输入文件lango.in共8行,每行8个字符;“.”代表一个空格;“B”代表黑子,“W”代表白子

Output

输出文件lango.out共一行,有一个整数,表示一步中黑方能吃掉白子的最大数,如果无法吃掉就输出“0”。

Samples

Input Copy

........ 
........ 
........ 
...BW... 
...WB... 
........ 
........ 
........

Output
1
Input Copy

........ 
........ 
...BB... 
...B.... 
..BBW... 
..WWW... 
....WB.. 
........

Output
2

根据数据范围来看,应该可以看出是一道深搜题
一般情况下要注意边界 + 其他条件,在这个题目里面边界为== x >= 1 && x <= 8 && y >= 1 && y <= 8 == , 这里面所有的数据均为合法数据,一旦x,y超过了这个范围或者是不在这个范围之内,就要区别出这一种异常
而对于其他条件,就是找到的棋子为 “.” ,因为如果当前位置对应的棋子为 "."时,为不可取状态(一排白色棋子,意为中间没有别的棋子,意即不包括空白)
对于上面两种情况,因为我们的函数要返回一个int类型的数,为了能够区分,我们可以返回一个比较小的负数,比如 -10(某一个方向最多有6个,所以返回-10足以),来区分以上两种不可取的情况

对于能够在某一个方向上一直找能够找到B的情况:
我们就要终止搜索,并返回 0 ,其余的情况是 dfs(x + 方向,y + 方向,方向下标标识) + 1,遇到B就停止因为B不包括在白棋子的数量之内,所以要返回一个 0 ,这里的方向下标标识代表某一个方向,在传递参数的过程中可以保存,并在递归的时候继续使用这个方向

Main_Code():

int dx[8]={0,0,1,1,1,-1,-1,-1};
int dy[8]={1,-1,1,0,-1,1,-1,0};
char s[10][10];
int dfs(int x,int y,int dir){
    if(x < 1|| x > 8 || y < 1 || y > 8 || s[x][y] == '.') return -10;
    if(s[x][y] == 'B') return 0;
    return dfs(x+dx[dir],y+dy[dir],dir) + 1;
}
int main()
{
    int ans = 0;
    for(int i=1;i<=8;i++) cin >> s[i] + 1;
    for(int i=1;i<=8;i++){
        for(int j=1;j<=8;j++){
            int temp = 0;
            for(int t=0;t<8;t++){
                if(s[i][j] == '.'){
                    temp += max(0,dfs(i+dx[t],j+dy[t],t));
                }
            }
            ans = max(ans,temp);
        }
    }
    cout<<ans;
    return 0;
}
原文地址:https://www.cnblogs.com/PushyTao/p/14507410.html