?? wissqu.cpp
字號:
/*
ID: dd.ener1
PROG: wissqu
LANG: C++
*/
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int s[6][6];//現在的牛,只使用1-4的數祖下標
int v[6][6][5];//v[i][j][k]表示(i,j)周圍k種牛的數目
int l[5]={3,3,3,4,3};//表示某種牛還剩下的個數
int stx[16],sty[16],stc[16];//棧上保存步驟,移(x,y)的c
int resx[16],resy[16],resc[16];
bool mark[6][6];//表示已經移動過了
int res;
void input(){
memset(s,-1,sizeof(s));
freopen("wissqu.in","r",stdin);
for(int i=1;i<=4;++i){
for(int j=1;j<=4;++j)
s[i][j]=getchar()-'A';
getchar();
}
}
void fill(int i,int j,int c,int d){
for(int d1=-1;d1<=1;++d1)
for(int d2=-1;d2<=1;++d2)
v[i+d1][j+d2][c]+=d;
}
void pretreat(){
memset(v,0,sizeof(v));
memset(mark,0,sizeof(mark));
for(int i=1;i<=4;++i)
for(int j=1;j<=4;++j)
fill(i,j,s[i][j],1);
}
void solution(){
if(!res)
for(int k=0;k<16;++k){
resx[k]=stx[k];
resy[k]=sty[k];
resc[k]=stc[k];
}
++res;
}
void replace(int i,int j,int n){
fill(i,j,s[i][j],-1);
s[i][j]=n;
fill(i,j,n,1);
}
void search(int k){
if(k==16){
solution();
return;
}
for(int c=0;c<5;++c){
if(l[c]<=0)continue;
stc[k]=c;
--l[c];
for(int i=1;i<=4;++i)
for(int j=1;j<=4;++j){
if(mark[i][j])continue;
if(v[i][j][c]>0)continue;
stx[k]=i;
sty[k]=j;
int old=s[i][j];
replace(i,j,c);
mark[i][j]=true;
search(k+1);
mark[i][j]=false;
replace(i,j,old);
}
++l[c];
}
}
void search0(){
const int c=3,k=0;
stc[k]=c;
--l[c];
for(int i=1;i<=4;++i)
for(int j=1;j<=4;++j){
if(v[i][j][c]>0)continue;
stx[k]=i;
sty[k]=j;
int old=s[i][j];
replace(i,j,c);
mark[i][j]=true;
search(k+1);
mark[i][j]=false;
replace(i,j,old);
}
++l[c];
}
void solve(){
pretreat();
search0();
}
void output(){
freopen("wissqu.out","w",stdout);
for(int i=0;i<16;++i)
printf("%c %d %d\n",'A'+resc[i],resx[i],resy[i]);
printf("%d\n",res);
}
int main(){
freopen("wissqu.log","w",stdout);
input();
solve();
output();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -