八拼圖演算法
Ⅰ 拼圖游戲演算法
我那個程序找不著了,我在那個帖子回了,你找一下。
這個演算法應該是BFS,DFS你覺得。。。呵呵。。
BFS+hash
HASH選擇排列數的康托展開。這樣可以在2s內圓滿解決。
(指2s預處理,然後應對所有的輸入瞬間出解)
Ⅱ 八巧板的來歷,什麼是最正宗的八巧板,能拼成什麼圖
八巧板的來歷
http://input.foruto.com/3sdm/zgsxwj.htm
立體八巧板立體八巧板是一種簡單的立體積木玩具,由八塊形狀各異的立體幾何圖
形組成。由於八塊設計巧妙,因此拼出的圖形很有趣。
製法:八塊板的形狀見圖一。可以發現,每塊板實際是由4 個小立方體
組成的,只不過組合的方式不同罷了。因此,製作的時候,可以用木塊或塑
料塊,先製成大小一樣的小立方體,然後按圖一粘合起來就行。
玩法:立體八巧板的玩法是用它拼搭各種立體幾何圖形。拼法很多,現
介紹三種。
一、拼相似形:用全部8 塊拼塊,組成8 個大拼塊,使它和每個小拼塊
相似,因為用的是8 塊,所以實際是放大8 倍。拼法見圖二。必須說明的是,
每一種放大塊的拼法不只一種,有的達幾十種,有的甚至達上千種。這里介
紹的只是其中一種。
二、拼「雙胞胎」:將8 塊拼板分成兩組,每組4 塊。用這兩組拼塊分
別拼成兩個立體圖形。要求這兩個立體圖形完全相同或對稱。它們的形狀就
像一對雙胞胎,所以我們稱這種拼法為拼」雙胞胎」。圖三是拼出的4 對「雙
胞胎」。
三、拼立體圖形:用8 塊拼板可以拼各種造型的圖形,圖四列出了一些
造型,它們分別是立體幾何圖形、建築和物體造型。如樓房、台階、紀念碑
等等。
Ⅲ 用8個三角形可以拼成什麼圖形
用8個三角形可以拼成一個大正方形。等腰三角形的頂角等於45⁰時,八個頂角可拼成360度,加上等腰且八個等腰三角形腰長相等底角頂點也兩兩重合就完成拼圖。八個全等的等腰直角三角形可拼成一個大正方形。每二個可拼成一個小正方形,四個小正方形拼成一個大正方形。
角的概念預定義
角的定義有公共端點是兩條射線組成的圖形叫做角,其中這個公共端點是角的頂點,這兩條射線是角的兩條邊。角的表示方法角可以用一個大寫字母表示也可以用三個大寫字母表示.其中頂點字母要寫在中間,唯有在頂點處只有一個角的情況,才可用頂點處的一個字母來記這個角。
否則分不清這個字母究竟表示哪個角.角還可以用一個希臘字母(如∠α,∠β,∠γ、…)表示,或用阿拉伯數字(∠1,∠2…)表示。
Ⅳ 3*3 型的拼圖界面。數字1~8 和一個空格。要實現能拼圖功能~~大概的演算法是怎樣的!!
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
void swap(int *a,int *b); //子函數聲明
int i,j,k,n,puzzle[81]={0},parity[81]={0}; //拼圖數組和奇偶性數組
char ch; //用來記錄拼圖數組可以轉換成順序矩陣,還是逆序矩陣
printf("游戲說明\n");
printf("↑ :數字向上 ↓ :數字向下\n");
printf("← :數字向左 → :數字向右\n");
printf("Esc:退出程序 Space:重置矩陣\n");
printf("\n");
loop1:
printf("難度設置\nn:");
scanf("%d",&n);
loop2:
system("cls"); //清屏
srand((unsigned)time(NULL)); //動態獲取數據
for(i=0;i<=n*n-1;i++)
{
loop3:
k=rand()%(n*n); //記錄新的數據
for(j=0;j<i;j++) //和舊的數據進行比較,當新的數據
if(puzzle[j]==k) goto loop3; //出現過時,重新獲取
if(j==i)
{
puzzle[j]=k; //當新的數據和舊的數據都不同時,將
} //數據放入拼圖數組中
}
for(i=0;i<=n*n-1;i++)
{
parity[i]=puzzle[i]; //將拼圖數組賦予奇偶性數組
}
for(i=0;i<=n*n-1;i++)
{
if(parity[i]==0) break; //找出奇偶性數組中0(空格)的位置
}
k=i;
for(j=1;j<=i/n;j++) //將0(空格)換到第1行
{
swap(&parity[k],&parity[k-n]);
k=k-n; //更新奇偶性數組中0(空格)的位置
}
for(j=1;j<=i%n;j++) //將0(空格)換到第1列
{
swap(&parity[k],&parity[k-1]);
k=k-1; //更新奇偶性數組中0(空格)的位置
}
k=0;
for(i=0;i<=n*n-1;i++)
for(j=i;j<=n*n-1;j++)
{
if(parity[i]>parity[j]) k++; //求奇偶性數組的「逆序數和」
}
if(k%2==0) printf("%d\n順序矩陣",n),ch='0'; //「逆序數和」為偶數時,是順序矩陣
else printf("%d\n逆序矩陣",n),ch='1'; //「逆序數和」為奇數時,是逆序矩陣
printf("\n");
for(i=0;i<=n*n-1;i++) //列印拼圖數組
{
if(puzzle[i]==0) printf("%*c",n,' '); //是0(空格)的位置,列印空格
else printf("%-*d",n,puzzle[i]); //是數字的位置,列印對應寬度的數字
if((i+1)%n==0&&i!=n*n-1) printf("\n"); //每列印n個數字,換一行列印
}
while(1)
{
for(i=0;i<=n*n-1;i++)
{
if(puzzle[i]==0) break; //記錄拼圖數組中0(空格)的位置
}
switch(getch())
{
case 72:if( i<n*(n-1)) swap(&puzzle[i],&puzzle[i+n]);break; //數字向上
case 80:if( i>1*(n-1)) swap(&puzzle[i],&puzzle[i-n]);break; //數字向下
case 75:if((i+1)%n!=0) swap(&puzzle[i],&puzzle[i+1]);break; //數字向左
case 77:if((i+0)%n!=0) swap(&puzzle[i],&puzzle[i-1]);break; //數字向右
case 27:exit(0); //退出程序
case 32:goto loop2; //重置矩陣
}
system("cls"); //清屏
switch(ch)
{
case '0':printf("%d\n順序矩陣\n",n);break; //完成拼圖的最終目標
case '1':printf("%d\n逆序矩陣\n",n);break; //完成拼圖的最終目標
}
for(i=0;i<=n*n-1;i++)
{
if(puzzle[i]==0) printf("%*c",n,' '); //是0(空格)的位置,列印空格
else printf("%-*d",n,puzzle[i]); //是數字的位置,列印對應寬度的數字
if((i+1)%n==0&&i!=n*n-1) printf("\n"); //每列印n個數字,換一行列印
}
for(i=0;i<=n*n-3;i++)
{
if(puzzle[i]!=i) break; //判斷拼圖數組是否為順序矩陣或逆序矩陣
}
if(i==n*n-2)
{ //是順序矩陣或是逆序矩陣時,完成拼圖
printf("\n恭喜你,拼圖完成了!\n"); //列印完成標志
printf("Continue(y/n)?");
if(getch()=='y')
{
system("cls"); //清屏
goto loop1; //重新開始
}
else
{
exit(0); //退出程序
}
}
}
getch(); //顯示運行結果
return(0); //正常運行返回0
}
void swap(int *a,int *b)
{
int c;
c=*a;
*a=*b;
*b=c;
}
Ⅳ 拼圖游戲的演算法(推動的拼圖)FLASH版
不一定只讓一個方塊移動,演算法可以是先把一張圖片分割好,為每個方塊指定一個整形的數字。然後寫一個方法,讓i行j列的方塊隨機往一個方向移動。調用這個方法若干次,效果上就像你讓人家玩魔方前,自己手工把它打亂。
數據結構方面,由於AS並不支持真正的多維數組,你可以用數組的數組來存放N*N的方塊:
var num:Number=10;
var blocks:Array=new Array();
var count:Number=0;
for(var i:Number=0;i<num;i++){
var row:Array=new Array();
for(var j:Number=0;j<num;j++){
row.push(count++);
}
blocks.push(row);
}
function randomMove(rowIndex:Number,colIndex:Number){
..
}
Good Luck
Ⅵ 關於數字拼圖的問題,什麼演算法可以找出最優的操作步驟數
先排好123,下面的只要排好65478的順序順時針轉就好。
Ⅶ 拼圖游戲演算法分析
BFS演算法。
隊列初始化
Repeat
h=當前狀態
for a=1 to 4 do begin
生成下一個目標
加入隊列
康托展開計算hash碼,標記訪問和步數
如果達到目標則退出過程
end
h退出隊列
until 隊列空
說明:隊列就是從頭進從尾出的一種線性數據結構,不懂自己查
康托展開不懂自己查,這個hash是必要的,不然不能在要求時間內解決問題。
bfs演算法應該就不錯。A*不能得到最優解。