ZOJ--1008:Gnome Tetravex(剪枝dfs)

来源:互联网 发布:tcp20端口和21端口 编辑:程序博客网 时间:2024/05/24 16:17

 刚开始 做了一下 超时  然后看网上说要用 剪枝  有趣查了剪枝算法 结果 测试用例(自己写了好多测试用例)都可以通过 但是就是一直WA 想哭


import java.util.Scanner;public class Gnome_Tetravex {static int n,arr[][],put[],cnt[],cn,game;static boolean can;public static void main(String[] args) {Scanner s=new Scanner(System.in);    while((n=s.nextInt())!=0){arr=new int[25][4];put=new int[25];cnt=new int[25];can=false;cn=0;int j;for(int i=0;i<n*n;i++){for(j=0;j<cn;j++)if(arr[j][0]==arr[i][0]&&arr[j][1]==arr[i][1]&&arr[j][2]==arr[i][2]&&arr[j][3]==arr[i][3])break;if(j==cn){arr[cn][0]=s.nextInt();arr[cn][1]=s.nextInt();arr[cn][2]=s.nextInt();arr[cn][3]=s.nextInt();cn++;}cnt[j]++;}game++;dfs(0);if(game>1)System.out.println();System.out.print("Game "+game+": ");if(can)System.out.print("Possible");elseSystem.out.print("Impossible");}}public static void dfs(int k){if(!can&&k==n*n){can=true;return;}else if(!can){for(int i=0;i<cn;i++){if(cnt[i]!=0&&(k%n==0||arr[put[k-1]][1]==arr[i][3])&&(k-n<0||arr[put[k-n]][2]==arr[i][0])){put[k]=i;cnt[i]--;dfs(k+1);cnt[i]++;}}}}}

C++版:

#include <map>  #include <set>  #include <queue>  #include <stack>  #include <math.h>  #include <vector>  #include <cstdio>  #include <string>  #include<string.h>  #include <iostream>  #include <algorithm>  using namespace std;  typedef long long ll;  int m[30][5],n,cnt;  int id[6][6];  int num[30];  bool ok;  void dfs(int x,int y)  {      if(ok) return ;      if(x>n)       {          ok=1;          return;      }      for(int i=1;i<cnt;i++)      {          if(num[i]==0) continue;          if(x>1&&m[id[x-1][y]][3]!=m[i][1]) continue;          if(y>1&&m[id[x][y-1]][2]!=m[i][4]) continue;          id[x][y]=i;          num[i]--;          if(y!=n)              dfs(x,y+1);          else              dfs(x+1,1);          if(ok) return ;          num[i]++;      }  }  int main()  {      int cas=0;      while(cin>>n&&n)      {          cnt=1;          memset(num,0,sizeof(num));          for(int i=0;i<n*n;i++)          {              int a,b,c,d,j;              cin>>a>>b>>c>>d;              for(j=1;j<cnt;j++)                  if(m[j][1]==a&&m[j][2]==b&&m[j][3]==c&&m[j][4]==d)                      break;              if(j==cnt)              {                  m[j][1]=a;                  m[j][2]=b;                  m[j][3]=c;                  m[j][4]=d;                  cnt++;              }              num[j]++;          }          ok=0;          dfs(1,1);          if(cas) cout<<endl;          cout<<"Game "<<cas+1<<": ";cas++;          if(!ok)              cout<<"Impossible\n";          else              cout<<"Possible\n";      }      return 0;  }


原创粉丝点击