0
点赞
收藏
分享

微信扫一扫

POJ-2837 DFS时不一定要用栈~


    题目很简单......但DFS时不断的递归回朔不仅使得时间效率很低...在跑9这个输入时..连系统栈都给爆了..其实仔细的思考..这题是DFS..但是可以不用栈..因为搜到了一个位置..可以很明确的知道若是失败了..我该跳回哪里..并且跳回去我还要尝试搜索哪些数..直接用个while循环就可以了...


Program:

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
int n,s[520][520];
bool used[2][1030][1030];
void search()
{
int i,x,y;
s[1][1]=0;
x=y=1;
while (y<=n)
{
for (i=s[y][x]+1;i<=2*n-1;i++)
if (!used[0][y][i] && !used[1][x][i] && !used[0][x][i] && !used[1][y][i])
{
used[0][y][i]=used[1][x][i]=used[0][x][i]=used[1][y][i]=true;
s[y][x]=i;
x++;
if (x>n) { y++; x=1; }
s[y][x]=0;
goto A;
}
x--;
if (!x) { y--; x=n; }
i=s[y][x];
used[0][y][i]=used[1][x][i]=used[0][x][i]=used[1][y][i]=false;
A: ;
}
return;
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
memset(used,false,sizeof(used));
scanf("%d",&n);
n=(int)pow(double(2),double(n));
search();
int i,j;
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++) printf("%d ",s[i][j]);
printf("\n");
}
return 0;
}



举报

相关推荐

0 条评论