HDU2553-回溯-N皇后问题
2017-08-04 11:09
218 查看
https://vjudge.net/problem/HDU-2553
中文题意。
开始的写法竟然多算了好多,不知道为啥。
后来转变了写法。 发现对角线有规律。
一个是 和是固定的,另一个是差值是固定的(类似斜率)
ac的
中文题意。
开始的写法竟然多算了好多,不知道为啥。
后来转变了写法。 发现对角线有规律。
一个是 和是固定的,另一个是差值是固定的(类似斜率)
#include <bits/stdc++.h> using namespace std; /*不知道为什么错,错误的写法 */ const int maxn=30; bool vis[maxn][maxn]; int m; int sum; queue<int>q; void dfs(int cengci){ if(cengci==m+1) {sum++; /*cout<<cengci<<"!!!!!"<<endl; for(int i=1;i<=m;i++){ for(int j=1;j<=m;j++) if(vis[i][j]) cout<<"1 "; else cout<<"0 "; cout<<endl; } cout<<"________________________"<<endl; queue<int>s=q; while(!s.empty()){ int u=s.front(); cout<<u<<" "; s.pop(); } cout<<endl; cout<<"***********************"<<endl; q.pop();*/ return ;} for(int i=1;i<=m;i++){ if(!vis[cengci][i]){ for(int x=1;x+i<=m+1&&cengci+x<=m+1;x++){ vis[cengci+x][x+i]=true;//对角线向下右侧 } for(int x=1;cengci-x>=1&&i-x>=1;x++) vis[cengci-x][i-x]=true;//对角线向下左 for(int x=1;cengci-x>=1&&i+x<=m;x++) vis[cengci-x][i+x]=true;//对角线向上右 for(int x=1;i-x>=1&&cengci+x<=m+1;x++) vis[cengci+x][i-x]=true;//对角线向上左 for(int x=1;x<=m;x++) {vis[x][i]=true;//竖直, vis[cengci][x]=true;//横向 } dfs(cengci+1); q.push(i); for(int x=1;x+i<=m+1&&cengci+x<=m+1;x++) vis[cengci+x][x+i]=false; for(int x=1;i-x>=1&&cengci+x<=m+1;x++) vis[cengci+x][i-x]=false; for(int x=1;x<=m;x++) {vis[x][i]=false; vis[cengci][x]=false; } for(int x=1;cengci-x>=1&&i-x>=1;x++) vis[cengci-x][i-x]=false; for(int x=1;cengci-x>=1&&i+x<=m;x++) vis[cengci-x][i+x]=false; } } } int main() { while(~scanf("%d",&m)){ sum=0; memset(vis,false,sizeof(vis)); dfs(1); printf("%d\n",sum); } return 0; }
ac的
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; const int maxn=20; int vis[3][maxn]; int m; int sum; void dfs(int cengci){ if(cengci==m+1) {sum++;return;} for(int i=1;i<=m;i++){ if(!vis[0][i]&&!vis[1][cengci-i+m]&&!vis[2][cengci+i]) { vis[0][i]=true; vis[1][cengci-i+m]=true; vis[2][cengci+i]=true; dfs(cengci+1); vis[0][i]=false; vis[1][cengci-i+m]=false; vis[2][cengci+i]=false; } } } int main() { int dp[11]; for(int i=1;i<=10;i++){ m=i; memset(vis,false,sizeof(vis)); sum=0; dfs(1); dp[i]=sum; } while(~scanf("%d",&m)){ if(!m) break; printf("%d\n",dp[m]); } return 0; }
相关文章推荐
- hdu2553 N皇后问题(回溯dfs)
- HDU2553 N皇后问题(回溯)
- hdu2553-N皇后问题.回溯
- HDU2553 N皇后问题(回溯+打表)
- 国际象棋“皇后”问题的回溯算法
- hdu2553 N皇后问题(深搜)
- hdu 2553 N皇后问题(回溯)
- 杭电2553--N皇后问题(回溯)
- N皇后问题回溯解法
- HDU 2553 N皇后问题 --- 经典回溯
- 【回溯】n皇后问题
- HDU2553:N皇后问题
- 回溯法解N皇后问题
- hdu 2553 N皇后问题(回溯)
- N皇后问题与回溯法
- N皇后问题(递归+回溯)的C++实现
- HDU 2553 N皇后问题(深搜+回溯)
- 8皇后问题(回溯)
- 回溯法解决8皇后问题
- 皇后问题 回溯