拼拼圖的演算法
Ⅰ 智能拼圖演算法
本來這個游戲技巧是有的,不過你要找最優解,可能構造解就有難度.
試試A*吧,雖然我沒寫過但我覺得搜索不至於太慢的,你的迭代搜索那麼慢可能是有些地方沒有優化.比如狀態去重,如果搜索的時候一直繞著4個方格在轉肯定就會有一堆浪費的搜索枝.
Ⅱ 急求拼圖的演算法
驗完了數是否合理以後就硬上吧...
n<=5而且不能旋轉,出題人已經相當仁慈了.
建一個5*5*5 boolean存片
dfs每一片
圖[x,y]and片[n,x,y]=true時剪掉
應該不難的吧...
Ⅲ 拼拼圖有什麼竅門么
1、先將拼圖按照顏色、有無直角、有無直邊分類;
2、觀察示例圖案顏色分布,例圖上人物、樹木的輪廓也要注意;
3、先拼接有直角、有直邊的,這就能拼接周邊的。從四周下手,因為比較容易 ;
4、同一顏色塊的一般是同一區域的,一個色塊一個色塊的連接;
5、觀察拼圖單個自身的形狀可以進行拼圖補接,這個往往是最困難處時運用的方法。
(3)拼拼圖的演算法擴展閱讀:
現代的拼圖大都以硬紙板為製造材料,因而成本更加低廉,製作工藝也更為簡單。拼圖的圖案是於切割前粘貼在紙板表面上的整幅的美術印品,畫面的內容可以是放大的攝影作品、繪畫,或者其他種類的平面藝術品。
貼圖後的紙板將被送入專門的壓印機床,該種機床上裝配有按預定圖案組合的鋼制刀具組,紙板經機床強力沖壓後將被刀具組切斷成零片。這一過程與圖形餅乾的成型工序頗為相似,不同之處在於,拼圖壓印機的沖撞力要高得多。比如典型的1000件拼圖,為了使沖模上的刀具組完全將紙板切透,就要求機床在運轉時生成高達700噸的壓力。
拼圖的沖模(印版)通常用膠合板一類的板材製成,制模工匠先在模板上按拼圖零片的拼組圖案刻畫或燒灼出溝槽,然後將刀片逐個插入溝槽拼裝成刀具組。刀具組表面還要加蓋一層彈性材料,通常為泡沫橡膠,其用途是在沖印後將紙板零片從刀具組的孔隙中彈出。
Ⅳ 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;
}
Ⅳ 拼圖游戲演算法分析
BFS演算法。
隊列初始化
Repeat
h=當前狀態
for a=1 to 4 do begin
生成下一個目標
加入隊列
康托展開計算hash碼,標記訪問和步數
如果達到目標則退出過程
end
h退出隊列
until 隊列空
說明:隊列就是從頭進從尾出的一種線性數據結構,不懂自己查
康托展開不懂自己查,這個hash是必要的,不然不能在要求時間內解決問題。
bfs演算法應該就不錯。A*不能得到最優解。
Ⅵ 25格拼圖計算有解的演算法
您好,您對拼圖這一塊有研究,能不能給我說一下,就是那種情況是無解的?
Ⅶ 機器人brett教自己做拼圖用的是什麼演算法
摘要 親,Brett機器人利用基於神經網路深度學習演算法,以試錯方式主動學習。例如,對於組裝玩具,機器人會不停嘗試...
Ⅷ 拼圖游戲的演算法(推動的拼圖)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
Ⅸ 急急急,演算法高手進,關於拼圖演算法
參考POJ1077題解網上都是
一般做法就是遍歷和a星演算法
具體資料多看看吧我就不貼了
沒編程基礎還是比較難搞懂的!~
希望對你有幫助