您的位置:首页 > 编程语言

杭电acm1045(搜索) 牛人代码 (2011-3-20 10:32)

2012-07-14 09:15 246 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045

//此人的代码剪枝做的非常好,决定吸收掉!

#include <iostream>

using namespace std;

char map[4][4];

int maxNum,n;

bool search(int row,int col)

{

int i;

for (i = row-1; i >= 0; --i)

{

if (map[i][col] == 'O') return false;

if (map[i][col] == 'X') break;

}

for (i = col-1; i >= 0; --i)

{

if (map[row][i] == 'O') return false;

if (map[row][i] == 'X') break;

}

return true;

}

void Solve(int k,int curNum)

{

int x,y;

if(k==n*n)

{

if(curNum>maxNum)

{

maxNum=curNum;

return;

}

}

else

{

x=k/n;//行号

y=k%n;//列号

if((map[x][y]=='.')&&(search(x,y)==true))

{//当前点是空白处,并且可以放置碉堡

map[x][y]='O';//放置碉堡

Solve(k+1,curNum+1);//递归进入下一个位置

map[x][y]='.';//回溯

}

//当前点不能放置或回溯回来

Solve(k+1,curNum);

}

}

int main()

{

int i,j;

while(cin>>n && n)

{

for (i=0;i<n;i++)

{

for (j=0;j<n;j++)

{

cin>>map[i][j];

}

}

maxNum=0;

Solve(0,0);

cout<<maxNum<<endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: