ZOJ 1008
2015-04-06 20:41
441 查看
这道题也是搜索,使用深度优先搜索就可以。当然,还是要注意一些小技巧的使用,来防止你的程序超时!
在注释中我标注了我使用的办法。
在注释中我标注了我使用的办法。
#include<stdio.h> typedef struct { int up; int right; int down; int left; }node; typedef struct { node data; int num; }lnode; node str[5][5]; int n; int flag; void dfs(lnode *base,int cnt,int k); int ret(node *p,int k); int main() { int count = 0; while(scanf("%d",&n)&&n!=0) { lnode base[25] = {0}; int i,cnt = 0; flag = 0; for(i = 0;i < n*n;i++) { node t; int j; scanf("%d %d %d %d",&t.up,&t.right,&t.down,&t.left); for(j = 0;j < cnt;j++) { if(t.down==base[j].data.down&&t.up==base[j].data.up&&t.left==base[j].data.left&&t.right==base[j].data.right) //如果方块中数字相同,只存一次,累计个数即可 { base[j].num++; break; } } if(j==cnt) { base[j].data = t; base[j].num++; cnt++; } } dfs(base,cnt,0); count++; if(count>1) { printf("\n"); } printf("Game %d: ",count); if(flag) { printf("Possible\n"); } else { printf("Impossible\n"); } } return 0; } void dfs(lnode *base,int cnt,int k) { int x,y; int i; x = k/n; y = k%n; if(k==n*n||flag) //只要有一种情况成功,函数就可以返回了,这样可以节省时间 { flag = 1; return; } for(i = 0;i < cnt;i++) { if(base[i].num&&ret(&base[i].data,k)) { base[i].num--; str[x][y] = base[i].data; dfs(base,cnt,k+1); base[i].num++; } } } int ret(node *p,int k) { int flag = 1; int x,y; x = k/n; y = k%n; if(x>0&&p->up!=str[x-1][y].down) { flag = 0; } if(y>0&&p->left!=str[x][y-1].right) { flag = 0; } return flag; }
相关文章推荐
- zoj 1008 Gnome Tetravex
- 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_GnomeTetravex
- zoj 1008
- ZOJ -1008 -Gnome Tetravex
- [搜索] ZOJ1002、ZOJ1008、ZOJ1019、POJ1011
- [ZOJ 1008]Gnome Tetravex (dfs搜索 + 小优化)
- (DFS)zoj1008-Gnome Tetravex
- zoj 1008 Gnome Tetravex
- ZOJ Problem Set - 1008
- ZOJ 1008 Gnome Tetravex
- ZOJ Problem Set - 1008 Gnome Tetravex (TLE)
- 浙大ZOJ 1008 Gnome Tetravex问题解决
- ZOJ 1008 Gnome Tetravex
- ZOj 1008 Gnome Tetravex