关于java连连看游戏的算法 我写过一个,用递归找出路径。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是不是广度遍历,能不能详细的讲一下呢。 我写过一个连连看外挂。就是用广度优先搜索的。#include <iostream>#define COL 19#define ROW 11using namespace std;int map[ROW][COL];int mturn[ROW][COL];struct point { int x; int y; int pret; int turn;};point ans,start;point queue[ROW*COL*2];int dx[4] = {-1,0,1,0}; //上,右,下,左 0 1 2 3int dy[4] = {0,1,0,-1};int deal(int pret,int turn) { if (pret == -1) { return 0; } else { if ( pret == 0 || pret == 2) { if (turn == 1 || turn == 3) { return 1; } else { return 0; } } else { if ( turn == 0 || turn == 2) { return 1; } else { return 0; } } }}bool check(int x,int y,int turn) { if ( x >= 0 && x < ROW && y >= 0 && y < COL && turn <= 2 && turn < mturn[x][y]) { return true; } else { return false; }}bool bfs(int x,int y) { // cout << " x " << x << " y " << y << endl; // // char cc; // // cin >> cc; // int top = 0, end = 0, i; point r,c; start.x = x; start.y = y; start.pret = -1; start.turn = 0; queue[top] = start; mturn[x][y] = 0; while (top <= end) { c = queue[top]; for (i = 0; i < 4; i++) { r.x = c.x + dx[i]; r.y = c.y + dy[i]; r.pret = i; r.turn =c.turn + deal(c.pret,i); /* cout <<"r.x "<<r.x << endl; cout <<"r.y "<<r.y << endl; cout <<"r.pret " <<r.pret << endl; cout <<"r.turn " <<r.turn << endl; */ if ( check(r.x,r.y,r.turn) ) { if ( map[start.x][start.y] == map[r.x][r.y] ) { ans.x = r.x; ans.y = r.y; return true; } else if ( map[r.x][r.y] == 0) { mturn[r.x][r.y] = r.turn; queue[++end] = r; //cout << r.x <<" " << r.y << endl;// } } } top++; } return false;}void init() { int i,j; for (i = 0; i < ROW; i++) { for ( j = 0; j < COL; j++) { mturn[i][j] = 10; } }}void move() { int i,j; int count = 0; for (i = 0; i < ROW;i++) { for ( j = 0; j < COL; j++) { if ( map[i][j] != 0) { count++; } } } while (count != 0) { for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if ( map[i][j] != 0) { init(); if ( bfs(i,j) ) { count -= 2; map[start.x][start.y] = 0; map[ans.x][ans.y] = 0; //click(); cout <<"start.x:"<<start.x<<" "<<"start.y:"<<start.y << endl; cout <<"ans.x:"<<ans.x <<" "<<"ans.y:"<<ans.y << endl; } } } } }}int main(){ for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { cin >> map[i][j]; } } /* for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { cout << map[i][j] <<" "; } cout << endl; } */ move(); return 0;}用c++写的。你不一定能看懂。不过,这算是一个比较简单的搜索问题。而且,这个问题。用广搜更经济一些。 外挂是实现,解连连看。也就是一步一步找点。而你要是做连连看的话,那问题应该是不一样的。你的问题应该是判断两个点,是否符合规则(能否消去)。更简单了,加限制条件的广搜就OK。挺简单的。 张老师的生日问题 求java code 求一个适合做黑盒测试的简单例子 以下代码有3个错误,请找出并说明为什么,谢谢 jtable使用了自定义编辑器后怎么让它双击后才进入编辑 问什么会输出0,0呢? 用myeclipse开发jsp,用什么界面设计插件呢? 关于JB不想用自带的JDK1.40,想用自己下载安装的JDK 5.0怎样设置的?详情请进...(给分!) zip压缩中参数的中文处理 用java画图如何画一个点? 我的java不太明白思想 jdbc驱动找不到 Java新人求指教
#include <iostream>
#define COL 19
#define ROW 11
using namespace std;
int map[ROW][COL];
int mturn[ROW][COL];
struct point {
int x;
int y;
int pret;
int turn;
};
point ans,start;
point queue[ROW*COL*2];
int dx[4] = {-1,0,1,0}; //上,右,下,左 0 1 2 3
int dy[4] = {0,1,0,-1};
int deal(int pret,int turn) {
if (pret == -1) {
return 0;
} else {
if ( pret == 0 || pret == 2) {
if (turn == 1 || turn == 3) {
return 1;
} else {
return 0;
}
} else {
if ( turn == 0 || turn == 2) {
return 1;
}
else {
return 0;
}
}
}
}
bool check(int x,int y,int turn) {
if ( x >= 0 && x < ROW && y >= 0 && y < COL && turn <= 2 && turn < mturn[x][y]) {
return true;
} else {
return false;
}
}
bool bfs(int x,int y) {
// cout << " x " << x << " y " << y << endl; //
// char cc; //
// cin >> cc; //
int top = 0, end = 0, i;
point r,c;
start.x = x;
start.y = y;
start.pret = -1;
start.turn = 0;
queue[top] = start;
mturn[x][y] = 0;
while (top <= end) {
c = queue[top]; for (i = 0; i < 4; i++) {
r.x = c.x + dx[i];
r.y = c.y + dy[i];
r.pret = i;
r.turn =c.turn + deal(c.pret,i);
/*
cout <<"r.x "<<r.x << endl;
cout <<"r.y "<<r.y << endl;
cout <<"r.pret " <<r.pret << endl;
cout <<"r.turn " <<r.turn << endl;
*/
if ( check(r.x,r.y,r.turn) ) {
if ( map[start.x][start.y] == map[r.x][r.y] ) {
ans.x = r.x;
ans.y = r.y;
return true;
} else if ( map[r.x][r.y] == 0) {
mturn[r.x][r.y] = r.turn;
queue[++end] = r;
//cout << r.x <<" " << r.y << endl;//
}
} }
top++;
}
return false;
}
void init() {
int i,j;
for (i = 0; i < ROW; i++) {
for ( j = 0; j < COL; j++) {
mturn[i][j] = 10;
}
}
}
void move() {
int i,j;
int count = 0;
for (i = 0; i < ROW;i++) {
for ( j = 0; j < COL; j++) {
if ( map[i][j] != 0) {
count++;
}
}
}
while (count != 0) {
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if ( map[i][j] != 0) {
init();
if ( bfs(i,j) ) {
count -= 2;
map[start.x][start.y] = 0;
map[ans.x][ans.y] = 0;
//click();
cout <<"start.x:"<<start.x<<" "<<"start.y:"<<start.y << endl;
cout <<"ans.x:"<<ans.x <<" "<<"ans.y:"<<ans.y << endl; }
}
}
}
}
}
int main()
{
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
cin >> map[i][j];
}
}
/*
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
cout << map[i][j] <<" ";
}
cout << endl;
}
*/
move();
return 0;
}
用c++写的。你不一定能看懂。不过,这算是一个比较简单的搜索问题。而且,这个问题。用广搜更经济一些。