洛谷 p1219 八皇后
1.深度优先算法应是手到擒来,上手编码,测试通过,提交,87分,最有一个测试点TLE.
附上代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int n;
int a[20];
int visited[20];
int count=0;
void dfs(int step){
int i,j,flag;
if(step==n+1){
count++;
if(count<=3){
for(i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
}
return;
}
for(i=1;i<=n;i++){
if(visited[i]==0){
flag=0;
for(j=1;j<step;j++)
if(abs(a[j]-i)==abs(j-step)){
flag=1;
break;
}
if(flag==0){
a[step]=i;
visited[i]=1;
dfs(step+1);
visited[i]=0;
}
}
}
}
int main(){
memset(visited,0,sizeof(visited));
scanf("%d",&n);
dfs(1);
printf("%d\n",count);
return 0;
}
2.翻开《算法竞赛入门经典(第2版)》,进行优化,提交87分,最后一个测试点TLE.
附上代码:
#include <string.h>
#include <stdlib.h>
int n;
int a[20];
int visited[3][30];
int count=0;
void dfs(int step){
int i,j,flag;
if(step==n+1){
count++;
if(count<=3){
for(i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
}
return;
}
for(i=1;i<=n;i++){
if(!visited[0][i]&&!visited[1][i+step]&&!visited[2][step-i+n]){
visited[0][i]=visited[1][i+step]=visited[2][step-i+n]=1;
a[step]=i;
dfs(step+1);
visited[0][i]=visited[1][i+step]=visited[2][step-i+n]=0;
}
}
}
int main(){
memset(visited,0,sizeof(visited));
scanf("%d",&n);
dfs(1);
printf("%d\n",count);
return 0;
}
4.仔细对比差别,第二个代码
int a[20];
int visited[3][30];
改成
int a[100];
int visited[3][100];
提交AC,天啊,折腾了这么长时间。
5.大家注意,数组不要开得太抠,开得大一些,能避免很多意想不到的问题。
附上AC代码,编译环境Dev-C++4.9.9.2
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int n;
int a[100];
int visited[3][100];
int count=0;
void dfs(int step){
int i,j,flag;
if(step==n+1){
count++;
if(count<=3){
for(i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
}
return;
}
for(i=1;i<=n;i++){
if(!visited[0][i]&&!visited[1][i+step]&&!visited[2][step-i+n]){
visited[0][i]=visited[1][i+step]=visited[2][step-i+n]=1;
a[step]=i;
dfs(step+1);
visited[0][i]=visited[1][i+step]=visited[2][step-i+n]=0;
}
}
}
int main(){
memset(visited,0,sizeof(visited));
scanf("%d",&n);
dfs(1);
printf("%d\n",count);
return 0;
}
2017-3-26 9:46