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

来源:互联网 发布:形容女人漂亮的网络词 编辑:程序博客网 时间:2024/05/17 10:03

    题目很简单......但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;}