zoj - 1008 Gnome Tetravex
2012-07-18 22:37
232 查看
典型的回溯,这题我一拖再拖,拖了好几天,然后觉得自己写不出来。可是今天搜了一下,答案是如此简短明了,我真的很诧异,难道我真的不行?好吧,我是一个回溯都没写过,所以才会这么力不从心,决定做几题练一练。
#include <iostream> #include <cstring> using namespace std; int q[25]; int s[25][4]; int num[25]; int flag,n,l; void dfs(int len) { if(flag) return; if(len == n * n) { flag = 1; return; } int i; for(i = 0;i < l;i++) { if(num[i] > 0) { if(len % n != 0) { if(s[i][3] != s[q[len - 1]][1]) continue; } if(len / n != 0) { if(s[i][0] != s[q[len - n]][2]) continue; } q[len] = i; num[i]--; dfs(len + 1); if(flag) return; num[i]++; } } return; } int main() { int m = 0; while(cin>>n, n) { memset(q,0,sizeof(q)); memset(num,0,sizeof(num)); int i,j,a,b,c,d; l = 0; for(i = 0;i < n * n;i++) { cin>>a>>b>>c>>d; for(j = 0;j < l;j++) { if(s[j][0] == a && s[j][1] == b && s[j][2] == c && s[j][3] == d) { num[j]++; break; } } if(j >= l) { s[l][0] = a; s[l][1] = b; s[l][2] = c; s[l][3] = d; num[l] = 1; l++; } } flag = 0; dfs(0); if(m) cout<<endl; cout<<"Game "<<++m<<": "; if(flag) cout<<"Possible"<<endl; else cout<<"Impossible"<<endl; } return 0; }
相关文章推荐
- zoj 1008 Gnome Tetravex
- ZOJ Problem Set - 1008 Gnome Tetravex (TLE)
- ZOJ 1008 Gnome Tetravex
- zoj 1008 Gnome Tetravex
- zoj 1008 Gnome Tetravex
- [ZOJ 1008]Gnome Tetravex (dfs搜索 + 小优化)
- zoj 1008 Gnome Tetravex
- ZOJ 1008 Gnome Tetravex
- ZOJ-1008-Gnome Tetravex
- zoj 1008 Gnome Tetravex
- zoj1008 Gnome Tetravex
- ZOJ 1008 Gnome Tetravex
- zoj 1008 Gnome Tetravex
- ZOJ 1008 Gnome Tetravex(DFS)
- ZOJ 1008 Gnome Tetravex
- zoj - 1008 Gnome Tetravex
- ZOj 1008 Gnome Tetravex
- ZOJ 1008 Gnome Tetravex(DFS)
- ZOJ 1008 Gnome Tetravex(DFS)
- zoj 1008 Gnome Tetravex (dfs+枚举)