codevs 1004 四子连棋 &#¥#)()*……)*%@¥()*&

1004 四子连棋

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
题解
题目描述  Description

在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。

 
 

 

输入描述  Input Description
从文件中读入一个4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地带用O表示。
输出描述  Output Description

用最少的步数移动到目标棋局的步数。

样例输入  Sample Input

BWBO
WBWB
BWBW
WBWO

样例输出  Sample Output

5

题目就是这样了。

是不是感觉。。。

()*……%#¥%#¥@%#()*&()*

反正我是这么想的,思路如下:

%#!#!%¥*……&¥!&#&……*()……¥*¥*)}{}:》}》《》《》+)&)……*……#%¥&())()……¥6&&(**854764$(&^78*%**O(*4)*(^7*#73&FGY948&&*0986*&¥……&%


嗯,大概就是这样。。

作为一个蒟蒻,这可是我第一个上百行的代码呢


代码如下()&¥%……:


#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,p,q,last,step,map[5][5];
};
queue<node> que;
node st;
int a[4],cnt,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
const int mod=985321;
bool m[985322];


bool check(node now)
{
int k=0;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
k=(k*3+now.map[i][j])%mod;
}
k=(k*3+now.last)%mod;
if(!m[k])
{
m[k]=true;
return false;
}
else return true;
}


bool line_up(node now)
{
if(now.map[0][0]==now.map[1][1]&&now.map[2][2]==now.map[1][1]&&now.map[2][2]==now.map[3][3])return true;
if(now.map[0][3]==now.map[1][2]&&now.map[1][2]==now.map[2][1]&&now.map[3][0]==now.map[2][1])return true;
for(int i=0;i<4;i++)
{
if(now.map[i][0]==now.map[i][1]&&now.map[i][2]==now.map[i][1]&&now.map[i][3]==now.map[i][2])return true;
if(now.map[0][i]==now.map[1][i]&&now.map[2][i]==now.map[1][i]&&now.map[3][i]==now.map[2][i])return true;
}
return false;
}


bool condition1(node now)
{
if(now.x>=0&&now.x<4)
if(now.y>=0&&now.y<4)
if(now.last!=now.map[now.x][now.y])
if(now.map[now.x][now.y]!=0)
return true;

return false;
}


bool condition2(node now)
{
if(now.p>=0&&now.p<4)
if(now.q>=0&&now.q<4)
if(now.last!=now.map[now.p][now.q])
if(now.map[now.p][now.q]!=0)
return true;

return false;
}


int bfs(int x,int y,int p,int q,int last)
{
st.x=x;st.y=y;st.p=p;st.q=q;st.last=0;
que.push(st);
while(!que.empty())
{
node curr=que.front();que.pop();
for(int i=0;i<4;i++)
{
node next=curr;
next.x+=dx[i];
next.y+=dy[i];
next.step++;
if(condition1(next))
{
swap(next.map[next.x][next.y],next.map[curr.x][curr.y]);
next.last=next.map[curr.x][curr.y];
if(!check(next)){
if(line_up(next))return next.step;

que.push(next);
}
swap(next.map[next.x][next.y],next.map[curr.x][curr.y]);
next.last=curr.last;
}
next.x-=dx[i];
next.y-=dy[i];
next.p+=dx[i];
next.q+=dy[i];
if(condition2(next))
{
swap(next.map[next.p][next.q],next.map[curr.p][curr.q]);
next.last=next.map[curr.p][curr.q];
if(!check(next)){
if(line_up(next))return next.step;

que.push(next);
}
swap(next.map[next.p][next.q],next.map[curr.p][curr.q]);
next.last=curr.last;
}
}
}
}


int main()
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
char c;cin>>c;
if(c=='B')st.map[i][j]=1;
else if(c=='W')st.map[i][j]=2;
else
{
st.map[i][j]=0;
a[cnt++]=i;
a[cnt++]=j;
}
}
getchar();
}
cout<<bfs(a[0],a[1],a[2],a[3],0);

return 0;

}




其实想一想,是真的难呢

以后谁和我提到“四子连棋”,我跟谁急哈哈哈哈(@&()&%()979^5)%¥&*!2&)?!。。


by hah

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值