UVA639八皇后变形式之中国象棋盘上放車

来源:互联网 发布:php中介者模式 编辑:程序博客网 时间:2024/05/17 21:39

这题数据最大只有4X4,很显然暴力回溯搜索就行了,刚开始自己想的是写一个递归,递归下标搜索,然后用一个临时的二维数组调用,

但是失败了,函数貌似不能调用二维数组。但实际上应该直接递归结果即放置的車的个数,每当搜到一个可以放置車的位置,标记,

往深层递归就行了,然后注意没有返回值但是有循环的递归,递归结束了相当于这个递归完成了,可以返回了,不要条件判断什么时候返回,

所以这里注意返回到上一层后注意把标记还原。

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<string>#include<algorithm>#include<map>#include<set>#include<vector>#include<stack>#include<queue>#include<climits>#define LL long longusing namespace std;const int N=201320;const LL mod=530600414;int a[6][6];int n;int dx[]={-1,1,0,0},dy[]={0,0,-1,1};int d[6][6];int ans;bool is_ok(int x,int y){     for(int i=0;i<4;i++)     {         int tx=x+dx[i],ty=y+dy[i];         while(a[tx][ty]==0) {tx=tx+dx[i];ty=ty+dy[i];}         if(a[tx][ty]==1)            return 0;     }     return 1;}void dfs(int p){    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)    {        if(!a[i][j]&&is_ok(i,j))        {            a[i][j]=1;            dfs(p+1);            a[i][j]=0;        }    }    ans=max(ans,p);}int main(){    while(cin>>n&&n)    {        getchar();        memset(a,-1,sizeof(a));        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)        {            char ch;            cin>>ch;            if(ch=='.')                a[i][j]=0;        }        ans=0;        dfs(0);        cout<<ans<<endl;    }    return 0;}


0 0