拼拼图的算法
Ⅰ 智能拼图算法
本来这个游戏技巧是有的,不过你要找最优解,可能构造解就有难度.
试试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星算法
具体资料多看看吧我就不贴了
没编程基础还是比较难搞懂的!~
希望对你有帮助