- package com.mingrui.recursion;
- import java.awt.event.*;
- import java.awt.*;
- import javax.swing.*;
- public class Test19_8 extends JFrame{
- private Cell[][] board=new Cell[8][8];
- private JButton jbFindPath=new JButton("找到出路・");
- private JButton jbClearPant=new JButton("清除路径");
- private JPanel jpUp,jpBut;
- Test19_8(){
- setSize(345,256);
- setResizable(false);
- setDefaultCloseOperation(3);
- setLocationRelativeTo(null);
- jpUp=new JPanel();
- jpBut=new JPanel();
- jpUp.setLayout(new GridLayout(8,8,2,2));
- for(int i=0;i<8;i++){
- for(int j=0;j<8;j++){
- board[i][j]=new Cell();
- jpUp.add(board[i][j]);
- }
- }
- add(jpUp,BorderLayout.CENTER);
- jpBut.add(jbFindPath);
- jpBut.add(jbClearPant);
- add(jpBut,BorderLayout.SOUTH);
- jbFindPath.addActionListener(new ActionListener(){
- public void actionPerformed(ActionEvent e){
- findPath();
- }
- });
- jbClearPant.addActionListener(new ActionListener(){
- public void actionPerformed(ActionEvent e){
- clearPath();
- }
- });
- setVisible(true);
- }
- public static void main(String [] args){
- new Test19_8();
- }
- public void findPath(){
- if(findPath(0,0)){
- System.out.println("我找到了");
- }
- else
- System.out.println("哎,白忙了,没找到");
- }
- public boolean findPath(int row,int col){
- board[row][col].visit();
- if(row==7&&col==7){
- board[row][col].selectedCell();
- return true;
- }
- if((row>0)&&!board[row-1][col].blocked()&&!board[row-1][col].marked()&&!board[row-1][col].visited()){
- block(row,col);
- if(findPath(row-1,col)){
- board[row][col].selectedCell();
- return true;
- }
- unblock(row,col);
- }
- if((row<7)&&!board[row+1][col].blocked()&&!board[row+1][col].marked()&&!board[row+1][col].visited()){
- block(row,col);
- if(findPath(row+1,col)){
- board[row][col].selectedCell();
- return true;
- }
- unblock(row,col);
- }
- if((col>0)&&!board[row][col-1].blocked()&&!board[row][col-1].marked()&&!board[row][col-1].visited()){
- block(row,col);
- if(findPath(row,col-1)){
- board[row][col].selectedCell();
- return true;
- }
- unblock(row,col);
- }
- if((col<7)&&!board[row][col+1].blocked()&&!board[row][col+1].marked()&&!board[row][col+1].visited()){
- block(row,col);
- if(findPath(row,col+1)){
- board[row][col].selectedCell();
- return true;
- }
- unblock(row,col);
- }
- return false;
- }
- public void clearPath(){
- for(int i=0;i<8;i++){
- for(int j=0;j<8;j++){
- board[i][j].desSelectedCell();
- }
- }
- }
- public void block(int row,int col){
- if(row>0)
- board[row-1][col].block();
- if(row<7)
- board[row+1][col].block();
- if(col>0)
- board[row][col-1].block();
- if(col<7)
- board[row][col+1].block();
- }
- public void unblock(int row,int col){
- if(row>0)
- board[row-1][col].unblock();
- if(row<7)
- board[row+1][col].unblock();
- if(col>0)
- board[row][col-1].unblock();
- if(col<7)
- board[row][col+1].unblock();
- }
- }
- class Cell extends JPanel{
- private boolean visited=false;
- private boolean marked=false;
- private boolean cellSelected=false;
- private boolean blocked=false;
- Cell(){
- setBackground(Color.red);
- addMouseListener(new MouseAdapter(){
- public void mousePressed(MouseEvent e) {
- marked = !marked;
- repaint();
- }
- });
- }
- protected void paintComponent(Graphics g){
- super.paintComponent(g);
- if(marked){
- g.drawLine(0, 0, getSize().width, getSize().height);
- g.drawLine(getSize().width, 0, 0, getSize().height);
- }
- }
- public boolean visited(){
- return visited;
- }
- public void visit(){
- visited=true;
- }
- public boolean marked(){
- return marked;
- }
- public void block(){
- blocked=true;
- }
- public void unblock(){
- blocked=false;
- }
- public boolean blocked(){
- return blocked;
- }
- public void selectedCell(){
- setBackground(Color.green);
- repaint();
- }
- public void desSelectedCell(){
- setBackground(Color.red);
- repaint();
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/260520149649.html
来源: http://www.codesnippet.cn/detail/260520149649.html