UVA 10651 Pebble Solitaire

本文介绍了如何使用广度优先搜索(BFS)解决一个涉及状态转移的问题,通过定义状态空间、初始化和搜索过程来找到从初始状态到目标状态的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UVA_10651

    由于总状态很少,所以直接广搜即可。

#include<stdio.h>
#include<string.h>
#define MAXD 10010
char b[20];
int d[MAXD], q[MAXD], hash[MAXD], N;
void init()
{
int i, j;
scanf("%s", b);
N = q[0] = 0;
for(i = 0; i < 12; i ++)
{
q[0] = (q[0] << 1) + (b[i] == 'o' ? (N ++, 1) : 0);
}
}
void solve()
{
int i, j, k, x, front , rear;
front = rear = 0;
memset(hash, 0, sizeof(hash));
hash[q[rear]] = 1;
d[rear] = 0;
rear ++;
while(front < rear)
{
x = q[front];
for(i = 0; i < 12; i ++)
if((1 << i) & x)
{
if(i < 10 && ((1 << (i + 1)) & x) && !((1 << (i + 2)) & x))
{
q[rear] = x ^ (1 << i) ^ (1 << (i + 1)) ^ (1 << (i + 2));
if(!hash[q[rear]])
{
d[rear] = d[front] + 1;
hash[q[rear]] = 1;
rear ++;
}
}
if(i > 1 && ((1 << (i - 1)) & x) && !((1 << (i - 2)) & x))
{
q[rear] = x ^ (1 << i) ^ (1 << (i - 1)) ^ (1 << (i - 2));
if(!hash[q[rear]])
{
d[rear] = d[front] + 1;
hash[q[rear]] = 1;
rear ++;
}
}
}
front ++;
}
printf("%d\n", N - d[rear - 1]);
}
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
init();
solve();
}
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值