题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1008
题目大意:给你n*n的矩阵,每个格子里有4个三角形,分别是上右下左,每个三角形里面标记了数字,问你能否通过移动这n*n个格子,使得相邻两个三角形具有相同的数字?
dfs暴搜,dfs(x,y)代表当前要放(x,y)这个位置。
然后枚举给定的每个格子。
如果说可以放,就dfs下一个格子。
这一道题需要把相同的格子压缩起来,也就是说为了节省时间,可以记录相同的格子出现的次数。
然后对于这不同种的格子去dfs。
如果不这样做会超时。
这算是一种优化方法吧。涨姿势了。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <string> 4 #include <iostream> 5 #include <cstring> 6 #include <algorithm> 7 #include <cctype> 8 #include <vector> 9 #include <map> 10 #include <set> 11 #include <iterator> 12 #include <functional> 13 #include <cmath> 14 #include <numeric> 15 #include <ctime> 16 using namespace std; 17 typedef long long LL; 18 typedef pair<int,int> PII; 19 typedef vector<int> VI; 20 #define PB push_back 21 #define MP make_pair 22 #define SZ size() 23 #define CL clear() 24 #define AA first 25 #define BB second 26 #define EPS 1e-8 27 #define ZERO(x) memset((x),0,sizeof(x)) 28 const int INF = ~0U>>1; 29 const double PI = acos(-1.0); 30 31 int n; 32 int now[10][10]; 33 bool vis[100]; 34 int ptr; 35 bool flag; 36 37 struct Node{ 38 int top,right,bottom,left; 39 int num; 40 bool operator==(const Node& b) const{ 41 return top==b.top&&right==b.right&&bottom==b.bottom&&left==b.left; 42 } 43 Node(int t=0,int r=0,int b=0,int l=0):top(t),right(r),bottom(b),left(l){} 44 }; 45 Node mp[100]; 46 47 void dfs(int x,int y){ 48 if(flag) return; 49 if( x==n || y==n ){ 50 flag = true; 51 return; 52 } 53 for(int i=0;i<ptr;i++){ 54 if( mp[i].num&& 55 (x==0||mp[now[x-1][y]].bottom==mp[i].top) 56 &&(y==0||mp[now[x][y-1]].right==mp[i].left) ){ 57 now[x][y] = i; 58 mp[i].num--; 59 if( y+1<n ) dfs(x,y+1); 60 else dfs(x+1,0); 61 mp[i].num++; 62 } 63 } 64 } 65 66 int main(){ 67 int kase = 1; 68 while(scanf("%d",&n),n){ 69 ptr = 0; 70 for(int i=0;i<n*n;i++){ 71 int t,r,b,l; 72 scanf("%d%d%d%d",&t,&r,&b,&l); 73 bool appear = 0; 74 for(int j=0;j<ptr;j++){ 75 if(Node(t,r,b,l)==mp[j]){ 76 mp[j].num++; 77 appear = 1; 78 } 79 } 80 if(!appear){ 81 mp[ptr] = Node(t,r,b,l); 82 mp[ptr++].num = 1; 83 } 84 } 85 86 flag = false; 87 dfs(0,0); 88 89 if(kase!=1) puts(""); 90 printf("Game %d: ",kase++); 91 puts(flag?"Possible":"Impossible"); 92 } 93 return 0; 94 }
时间: 2024-10-10 18:00:15