?? 獨立鉆石其.txt
字號:
“獨立鉆石棋”是起源與法國的一種棋類游戲,具體布局如下:
口口口
口口口
口口口口口口口
口口口 口口口
口口口口口口口
口口口
口口口
行棋規則:每個子只能沿著棋盤上的縱橫線“隔子跳”(像跳棋一樣,跳過一個相
鄰的棋子),跳到一個空格處,跳后被跳過的棋子將拿掉。
這樣,棋子跳到最后,無子可再動時,游戲結束。
當游戲結束時,只剩一個棋子,并且這個棋子落在棋盤的中央,為最佳結果!
獨立鉆石棋有以下算法:(P43.0一分鐘之內算出:)
#include <stdio.h>
int map[7][7]={
{2,2,1,1,1,2,2},
{2,2,1,1,1,2,2},
{1,1,1,1,1,1,1},
{1,1,1,0,1,1,1},
{1,1,1,1,1,1,1},
{2,2,1,1,1,2,2},
{2,2,1,1,1,2,2}};
struct jump
{
int x1,y1,x2,y2;
} l[32];
int p=0;
bool move(int x1,int y1,int x2,int y2);
main()
{
if(!move(1,3,3,3))printf("\nFailure!");
}
bool move(int x1,int y1,int x2,int y2)
{
bool tmp=false;
int i,j;
if(0<=x2&&x2<=7&&0<=y2&&y2<=7&&map[x2][y2]==0&&map[(x1+x2)/2][(y1+y2)/2]==1)
{
map[x2][y2]=1;map[x1][y1]=0;map[(x1+x2)/2][(y1+y2)/2]=0;
l[p].x1=x1;l[p].y1=y1;l[p].x2=x2;l[p].y2=y2;p++;
if(p==31&&map[3][3]==1)
{
for(i=0;i<p;i++)
{
if(i%5==0)printf("\n");
printf("(%d,%d)->(%d,%d) ",l[i].x1,l[i].y1,l[i].x2,l[i].y2);
}
tmp=true;
}
for(i=0;i<7&&!tmp;i++)for(j=0;j<7&&!tmp;j++)if(map[i][j]==1)
tmp=move(i,j,i-2,j)||move(i,j,i,j-2)||move(i,j,i+2,j)||move(i,j,i,j+2);
map[x2][y2]=0;map[x1][y1]=1;map[(x1+x2)/2][(y1+y2)/2]=1;p--;
}
return tmp;
}
但如果把棋盤變復雜了(加一層):
#include <iostream.h>
int diamond[9][9]=
{{2,2,2,1,1,1,2,2,2}
,{2,2,2,1,1,1,2,2,2}
,{2,2,2,1,1,1,2,2,2}
,{1,1,1,1,1,1,1,1,1}
,{1,1,1,1,0,1,1,1,1}
,{1,1,1,1,1,1,1,1,1}
,{2,2,2,1,1,1,2,2,2}
,{2,2,2,1,1,1,2,2,2}
,{2,2,2,1,1,1,2,2,2}};
struct procession
{
int x1,x2,y1,y2;
}pro[44];
int p=0;
bool move(int x1,int y1,int x2,int y2);
void main()
{
if(!move(2,4,4,4))
cout<<"不存在走法。";
}
bool move(int x1,int y1,int x2,int y2)
{
bool flag=false;
int i,j;
if(x2>=0&&x2<=9&&y2>=0&&y2<=9&&diamond[x2][y2]==0&&diamond[(x1+x2)/2][(y1+y2)/2]==1)
{
diamond[x2][y2]=1;
diamond[x1][y1]=0;
diamond[(x1+x2)/2][(y1+y2)/2]=0;
pro[p].x1=x1;
pro[p].y1=y1;
pro[p].x2=x2;
pro[p].y2=y2;
p++;
if(p==43&&diamond[4][4]==1)
{
for(i=0;i<p;i++)
cout<<pro[i].x1<<pro[i].y1<<"->"<<pro[i].x2<<pro[i].y2<<endl;
flag=true;
}
for(i=0;i<9&&!flag;i++)
for(j=0;j<9&&!flag;j++)
if(diamond[i][j]==1)
flag=move(i,j,i,j-2)||move(i,j,i+2,j)||move(i,j,i,j+2)||move(i,j,i-2,j);
diamond[x2][y2]=0;
diamond[x1][y1]=1;
diamond[(x1+x2)/2][(y1+y2)/2]=1;
p--;
}
return flag;
}
且好久也算不出:
大家有辦法嗎?
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -