poj1315 Don\'t Get Rooked

这是第一个DFS题,没有任何头绪,所以参考别人的程序http://www.cnblogs.com/lzmfywz/p/3240249.html

import java.util.Scanner;

public class NoRooked
{
static char str[][];
static int map[][];
static int ans;
static int n;

void DFS(int sum)
{
ans = Math.max(ans, sum);

for(int i=0; i<n; i++)//按先行后列的顺序逐个位子查看能不能放,如果能放就设map[i][j]=1;
{
for(int j=0; j<n; j++) //搜索是先列后行的,j代表列,k是行。
{
boolean bflag = true;//假设(i,j)位置可以放,即把bflag设为true.

for(int k=i; k<n; k++)//在第j列,从i后面进行搜索,找到x或者是在j列已放过车的位置,如果找到已放过车了,此时(i,j)就不能放车了
{
if(map[k][j]==1)
{
bflag = false;
break;
}
else
{
if(str[k][j] == 'X')
break;
}
}

for(int k=i-1; k>=0; k--)//从i-1向前搜索
{
if(map[k][j]==1)
{
bflag = false;
break;
}
else
{
if(str[k][j] == 'X')
break;
}
}

for(int k=j; k<n; k++)//行搜索 在i行的j以后的进行搜索
{
if(map[i][k]==1)
{
bflag = false;
break;
}
else if(str[i][k] == 'X')
break;
}

for(int k=j-1; k>=0; k--)//行搜索 在i行的j以前的进行搜索
{
if(map[i][k]==1)
{
bflag = false;
break;
}
else if(str[i][k] == 'X')
break;
}

if(bflag && str[i][j] != 'X')
{
map[i][j] = 1; //标志

DFS(sum + 1);

map [i][j] = 0;
}
}
}
}

public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
n = cin.nextInt();

while(n != 0)
{
str = new char [n][n];
map = new int [n][n];
ans = 0;

//读取字符数组
for(int i=0; i<n; i++)
str[i] = cin.next().toCharArray();

//对map进行初始化
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
map[i][j] = 0;

NoRooked nr = new NoRooked();

nr.DFS(0);

//输出最多可以停放车的数目
System.out.println(ans);

//读取下一个数组的维度
n = cin.nextInt();

}

cin.close();
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值