博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 704 Colour Hash
阅读量:7221 次
发布时间:2019-06-29

本文共 4621 字,大约阅读时间需要 15 分钟。

UVA_704

    以前即使八数码问题也没有用双向BFS,但这次状态数太多了,于是不得不使用双向BFS了。

#include
#include
#include
#define HASH 10000003 int head1[HASH],next1[100000],head2[HASH],next2[100000]; int st[200000][21],dis[200000],front,rear; int fa[200000],flag[200000],dir,ans,mid; int target[21]={
0,3,4,3,0,5,6,5,0,1,2,1,0,7,8,7,0,9,10,9,0}; int hash(int *a) {
int i,v=0; for(i=0;i<21;i++) v=(v*10+a[i])%HASH; return v; } int insert(int s) {
int i,h; h=hash(st[s]); if(!dir) {
for(i=head1[h];i!=-1;i=next1[i]) if(memcmp(st[s],st[i],sizeof(st[i]))==0) break; if(i==-1) {
next1[s]=head1[h]; head1[h]=s; return 1; } } else {
for(i=head2[h];i!=-1;i=next2[i]) if(memcmp(st[s],st[i],sizeof(st[i]))==0) break; if(i==-1) {
next2[s]=head2[h]; head2[h]=s; return 1; } } return 0; } int search(int s) {
int i,h; h=hash(st[s]); for(i=head1[h];i!=-1;i=next1[i]) if(memcmp(st[s],st[i],sizeof(st[i]))==0) break; if(i==-1) return 0; else return i; } void bfs() {
int i,p,temp[2]; while(front
1;i--) st[rear][i]=st[rear][i-2]; st[rear][1]=temp[1]; st[rear][0]=temp[0]; if(insert(rear)) {
fa[rear]=front; flag[rear]=p; dis[rear]=dis[front]+1; rear++; } } else if(p==2) {
memcpy(st[rear],st[front],sizeof(st[front])); temp[0]=st[front][9]; temp[1]=st[front][10]; for(i=9;i<19;i++) st[rear][i]=st[rear][i+2]; st[rear][19]=temp[0]; st[rear][20]=temp[1]; if(insert(rear)) {
fa[rear]=front; flag[rear]=p; dis[rear]=dis[front]+1; rear++; } } else if(p==3) {
memcpy(st[rear],st[front],sizeof(st[front])); temp[0]=st[front][0]; temp[1]=st[front][1]; for(i=0;i<10;i++) st[rear][i]=st[rear][i+2]; st[rear][10]=temp[0]; st[rear][11]=temp[1]; if(insert(rear)) {
fa[rear]=front; flag[rear]=p; dis[rear]=dis[front]+1; rear++; } } else {
memcpy(st[rear],st[front],sizeof(st[front])); temp[0]=st[front][19]; temp[1]=st[front][20]; for(i=20;i>10;i--) st[rear][i]=st[rear][i-2]; st[rear][9]=temp[0]; st[rear][10]=temp[1]; if(insert(rear)) {
fa[rear]=front; flag[rear]=p; dis[rear]=dis[front]+1; rear++; } } } front++; } } void printpath1(int a) {
if(fa[a]!=-1) printpath1(fa[a]); else return; printf("%d",flag[a]); } void printpath2(int a) {
if(fa[a]!=-1) {
if(flag[a]>2) printf("%d",flag[a]-2); else printf("%d",flag[a]+2); printpath2(fa[a]); } else return; } int main() {
int i,j,k,p,t; scanf("%d",&t); while(t--) {
for(i=0;i<24;i++) {
scanf("%d",&k); if(i<21) st[0][i]=k; } front=rear=0; fa[rear]=-1; memset(head1,-1,sizeof(head1)); dir=0; insert(rear); dis[rear]=0; rear++; bfs(); if(front!=rear) {
if(ans==0) printf("PUZZLE ALREADY SOLVED\n"); else {
printpath1(front); printf("\n"); } continue; } memcpy(st[rear],target,sizeof(target)); front=rear; fa[rear]=-1; dir=1; memset(head2,-1,sizeof(head2)); insert(rear); dis[rear]=0; rear++; bfs(); if(front!=rear) {
printpath1(mid); printpath2(front); printf("\n"); } else printf("NO SOLUTION WAS FOUND IN 16 STEPS\n"); } return 0; }

  

转载地址:http://suhym.baihongyu.com/

你可能感兴趣的文章
ARM公司收购Apical,欲致力推进“目联网”技术
查看>>
各地纷纷抢建互联网数据中心
查看>>
永信至诚助“海南省首届网络安全大赛”决赛圆满收官
查看>>
科普知识:什么是攻击隐写术
查看>>
趋势所需 统一存储逐渐走向成熟
查看>>
聚合、增值和生态:神州数码云科服务再拓新局
查看>>
"运营"与"增长黑客"之间差一个数据驱动
查看>>
勒索软件从未停止
查看>>
《VMware Virtual SAN权威指南》一2.3.4 VMkernel网络
查看>>
AMD:将在机器学习GPU领域“引发从来没有过的竞争”
查看>>
《计算机视觉:模型、学习和推理》一2.4 条件概率
查看>>
Riverbed将SD-WAN融入WAN优化
查看>>
信息管税邂逅大数据,加速破解新常态下税收剪刀差
查看>>
从应用角度谈谈初创企业服务器采购建议与解决方案
查看>>
修改CPU 对抗计算机病毒
查看>>
8个方法让你成为更优秀的程序员
查看>>
城市之眼视觉计算技术
查看>>
bd:快速返回某级父目录而不用冗余地输入 “cd ../../..”
查看>>
Wi-FM:借调频无线电信号可大幅提高无线网速
查看>>
IT宕机,和力记易容灾备份能做什么
查看>>