标签:sgu
题目大意:给定一个n*n的国际象棋棋盘和k个后,问使得所有后互不相攻击方案数。
题解:无脑爆搜(和紫书P193上面那个差不多),我265ms过的,0.75秒就会T,还好,捏一把冷汗。
%%%__debug大神今天一下午过了BZOJ1999树网的核加强版,还口口声声地吐槽联赛数据弱,WA3个地方的程序都能A。
#include<cstdio> #include<cstdlib> #include<algorithm> #include<iostream> #include<cstring> const int MAXN=11,MAXK=101; int n,k,vis[MAXN]; long long times,ans=0; void dfs(int cur,int res) { if(cur==n||res==0){ans++;return ;} if(res<n-cur)dfs(cur+1,res); for(int i=0;i<n;i++) { int ok=1; vis[cur]=i; for(int j=0;j<cur;j++) if((vis[cur]>=0&&vis[j]>=0)&&(vis[cur]==vis[j]||cur-vis[cur]==j-vis[j]||cur+vis[cur]==j+vis[j])) {ok=0;break;} if(ok)dfs(cur+1,res-1); vis[cur]=-1; } } int main() { freopen("224.in","r",stdin); freopen("w.out","w",stdout); scanf("%d %d",&n,&k); memset(vis,-1,sizeof(vis)); if(k>n){printf("0\n");return 0;} if(k==0){printf("1\n");return 0;} dfs(0,k); std::cout<<ans<<std::endl; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:sgu
原文地址:http://blog.csdn.net/sakai_masato/article/details/48008799