您的位置:首页 > 其它

POJ1321-Chess Problem(dfs基础题)

2018-03-09 13:07 169 查看
题意:
        中文题干,不多说了.

解题思路:
        基础dfs.dfs思路其实很简单,就是走到走不了了以后,就回退一步,然后重新搜索.

        用bool chess[9][9]标记哪些可以走,用col[9]标记哪些列走过了,从第一行往下搜.

        代码用递归的实现的,初学的时候,看代码都比较费劲,这个时候就需要自己手动模拟一遍,模拟完了以后,就都明白了.

        下面上我的手动模拟过程(太乱...勿介意....就是为了让大家自己去模拟做个垃圾示范....



接下来上代码,初学的话,需要手打一遍代码,然后手动模拟一遍,这样基本就领会dfs大概代码思路了.#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

bool chess[9][9]; //标记哪些点能走
bool col[9]; //标记哪几列走过了
int n,k,status; //status:可行方案

void dfs(int row,int num)
{
if(num == k)
{
status++;
return;
}
if(row > n)
return;
for(int i = 1;i <= n;i++)
{
if(!col[i] && chess[row][i])
{
col[i] = true; //标记走过了
dfs(row+1,num+1); //跳到下一行
col[i] = false; //取消标记
}
}
dfs(row+1,num); //没有取点到下一行
return;

}

int main()
{
int j,i;

while(cin>>n>>k)
{
memset(chess,false,sizeof(chess));
memset(col,false,sizeof(col)); //初始化
status = 0;
if(n == -1 && k == -1)
break;

for(i = 1;i <= n;i++)
{
for(j = 1;j <= n;j++)
{
char a;
cin>>a;
if(a == '#')
chess[i][j] = true;
}
}
dfs(1,0);
cout<<status<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索-dfs