将8个数字填进图中,让相邻的点上的数字不相邻,8个数字全排列枚举即可
要注意全排列的求法
#include<algorithm>
do{
…………
}
while(next_permutation(a,a+8));
Another Eight Puzzle
3 7 3 1 4 5 8 0 0 7 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
Case 1: 7 3 1 4 5 8 6 2 Case 2: Not unique Case 3: No answer
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; int a[8]={1,2,3,4,5,6,7,8}; int b[8]; int pos[8]; int p; int cot; int flag; int end[8]; void judge() { int i,j,f=0; for(i=0;i<p;i++) { if(a[i]!=b[pos[i]]) { f=1; break; } } if(f) return; if(a[0]-a[1]==-1||a[0]-a[1]==1) return; if(a[0]-a[2]==-1||a[0]-a[2]==1) return; if(a[0]-a[3]==-1||a[0]-a[3]==1) return; if(a[1]-a[2]==-1||a[1]-a[2]==1) //B C return; if(a[1]-a[4]==-1||a[1]-a[4]==1) // B E return; if(a[1]-a[5]==-1||a[1]-a[5]==1) //B F return; if(a[2]-a[3]==-1||a[2]-a[3]==1) //C D return; if(a[2]-a[4]==-1||a[2]-a[4]==1) //C E return; if(a[2]-a[5]==-1||a[2]-a[5]==1) //C F return; if(a[2]-a[6]==-1||a[2]-a[6]==1) //C G return; if(a[3]-a[5]==-1||a[3]-a[5]==1) // D F return; if(a[3]-a[6]==-1||a[3]-a[6]==1) //D G return; if(a[4]-a[5]==-1||a[4]-a[5]==1) // E F return; if(a[4]-a[7]==-1||a[4]-a[7]==1) //E H return; if(a[5]-a[6]==-1||a[5]-a[6]==1) //F G return; if(a[5]-a[7]==-1||a[5]-a[7]==1) //F H return; if(a[6]-a[7]==-1||a[6]-a[7]==1) //G H return; flag=1; cot++; if(cot==1) { for(i=0;i<8;i++) end[i]=a[i]; } } int main() { int i,j,k,l; scanf("%d",&l); for(k=1;k<=l;k++) { memset(pos,-1,sizeof(pos)); for(i=0;i<8;i++) { a[i]=i+1; } cot=0; flag=0; p=0; for(i=0;i<8;i++) { scanf("%d",&b[i]); if(b[i]!=0) { pos[p++]=i; } } do{ if(cot==2) break; if(a[0]==7&&a[1]==3&&a[2]==1&&a[3]==4&&a[4]==5&&a[5]==8&&a[6]==6&&a[7]==2) { j=9; } judge(); }while(next_permutation(a,a+8)); printf("Case %d:",k); if(cot==1) { for(i=0;i<8;i++) printf(" %d",end[i]); printf("\n"); } else if(cot==2) { printf(" Not unique\n"); } else { printf(" No answer\n"); } } return 0; }