ZOJ_1008_GnomeTetravex
来源:互联网 发布:淘宝机器人在哪里设置 编辑:程序博客网 时间:2024/04/30 02:31
Tetravex是什么彩色方块对对碰……
这个问题在输出上坑了一下人。
题目中
<span style="color: rgb(34, 34, 34); font-family: 'times new roman'; font-size: 17px; background-color: rgb(234, 235, 255);">Print a blank line between each game case.</span>
between……
总体感觉没什么特别的,据说不剪枝会超时。
剪枝做的就是把相同的卡片 拿出来。
#include <iostream>#include <stdio.h>using namespace std;const int M=6;int s[M*M][5]; //记录输入 s[][4]用来计入相同卡片的个数,没有相同的个数为1int re[M][M][3]; //记录答案,由于从左往右从上到下则只需要记录用过卡片的右和下 re[][][2]用来标记是否填过了int f;bool iss(int i,int n1,int n2,int n3,int n4) //判断卡片是否相同{ if(s[i][0]==n1&&s[i][1]==n2&&s[i][2]==n3&&s[i][3]==n4) return 1; else return 0;}void dfs(int x,int y,int n){ if(f) return; if(x==n) { f=1; return; } if(re[x][y][2]==1) { if(y<n-1) dfs(x,y+1,n); else dfs(x+1,0,n); } else { for(int i=0;i<n*n;i++) { if(s[i][4]) { if(x==0&&y==0) { re[0][0][0]=s[i][1];re[0][0][1]=s[i][2];re[0][0][2]=1; s[i][4]--; dfs(x,y,n); re[0][0][2]=0; s[i][4]++; } else if(x==0&&y) { if(re[0][y-1][0]==s[i][3]) { re[0][y][0]=s[i][1];re[0][y][1]=s[i][2];re[0][y][2]=1; s[i][4]--; dfs(x,y,n); re[0][y][2]=0; s[i][4]++; } } else if(y==0&&x) { if(re[x-1][0][1]==s[i][0]) { re[x][0][0]=s[i][1];re[x][0][1]=s[i][2];re[x][0][2]=1; s[i][4]--; dfs(x,y,n); re[x][0][2]=0; s[i][4]++; } } else //x!=0,y!=0 { if(re[x][y-1][0]==s[i][3]&&re[x-1][y][1]==s[i][0]) { re[x][y][0]=s[i][1];re[x][y][1]=s[i][2];re[x][y][2]=1; s[i][4]--; dfs(x,y,n); re[x][y][2]=0; s[i][4]++; } } } } }}void clears(){ for(int i=0;i<M*M;i++) s[i][4]=0;}int main(){ int n; int n1,n2,n3,n4; int co=1; while(1) { f=0; scanf("%d",&n); if(!n) break; for(int i=0;i<n*n;i++) { int sf=0; scanf("%d%d%d%d",&n1,&n2,&n3,&n4); for(int j=0;j<i;j++) if(iss(j,n1,n2,n3,n4)) { s[j][4]++; sf=1; } if(!sf) { s[i][0]=n1; s[i][1]=n2; s[i][2]=n3; s[i][3]=n4; s[i][4]=1; } } dfs(0,0,n); if(co>1) //没有错就是这里坑人 printf("\n"); if(f) printf("Game %d: Possible\n",co); else printf("Game %d: Impossible\n",co); co++; clears(); } return 0;}
0 0