|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
八皇后问题,见 https://www.luogu.com.cn/problem/P1219
最后一个点TLE,请问如何优化才能过呢
谢谢了
C++代码:
- #include <iostream>
- using namespace std;
- int map[20][20],n,ans,out[3][20];
- inline void change(int x,int y,int op)
- {
-
- for(int i=0;i<n;i++)
- {
- map[i][y]+=op;
- map[x][i]+=op;
-
- }
- for(int i=1-n;i<n;i++)
- {
- if((x-i)>-1 and (y-i)>-1 and (x-i)<n and (y-i)<n) map[x-i][y-i]+=op;
- if((x+i)>-1 and (y-i)>-1 and (x+i)<n and (y-i)<n) map[x+i][y-i]+=op;
- }
- }
- void dfs(int col)
- {
-
- if(col==n-1)
- {
- for(int i=0;i<n;i++)
- {
- if(!map[col][i])
- {
- if(ans<3)out[ans][col]=i+1;
- ans++;
- }
- }
- }
- else
- for(int i=0;i<n;i++)
- {
- if(!map[col][i])
- {
- change(col,i,1);
- if(ans<3)for(int j=ans;j<3;j++)out[j][col]=i+1;
- dfs(col+1);
-
- change(col,i,-1);
- }
- }
- }
- int main()
- {
- ios::sync_with_stdio(false);
- cin.tie(),cout.tie();
- cin>>n;
- dfs(0);
- for(int i=0;i<3;i++)
- {
- for(int j=0;j<n;j++)
- {
- cout<<out[i][j]<<" ";
- }
- cout<<endl;
- }
- cout<<ans<<endl;
- }
复制代码
本帖最后由 陶远航 于 2023-7-20 16:32 编辑
这个再试试
- #include<iostream>
- #include<cstdlib>
- #include<cstdio>
- #include<cmath>
- using namespace std;
- int a[100],b[100],c[100],d[100];
- int total;
- int n;
- int print()
- {
- if(total<=2)
- {
- for(int k=1;k<=n;k++)
- cout<<a[k]<<" ";
- cout<<endl;
- }
- total++;
- }
- void queen(int i)
- {
- if(i>n)
- {
- print();
- return;
- }
- else
- {
- for(int j=1;j<=n;j++)
- {
- if((!b[j])&&(!c[i+j])&&(!d[i-j+n]))
- {
- a[i]=j;
- b[j]=1;
- c[i+j]=1;
- d[i-j+n]=1;
- queen(i+1);
- b[j]=0;
- c[i+j]=0;
- d[i-j+n]=0;
- }
- }
- }
- }
- int main()
- {
- cin>>n;
- queen(1);
- cout<<total;
- return 0;
- }
复制代码
|
|