1. 程式人生 > >洛谷 P2324 [SCOI2005]騎士精神

洛谷 P2324 [SCOI2005]騎士精神

href 一行 src .org ref img algo 精神 tar

P2324 [SCOI2005]騎士精神

題目描述

技術分享

輸入輸出格式

輸入格式:

第一行有一個正整數T(T<=10),表示一共有N組數據。接下來有T個5×5的矩陣,0表示白色騎士,1表示黑色騎士,*表示空位。兩組數據之間沒有空行。

輸出格式:

對於每組數據都輸出一行。如果能在15步以內(包括15步)到達目標狀態,則輸出步數,否則輸出-1。

輸入輸出樣例

輸入樣例#1:
2
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100
輸出樣例#1:
7
-1

說明

技術分享

思路:A*

錯因:字母x,y的大小寫混淆。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int fxy[6][6]={{9,9,9,9,9,9},
               {9,1,1,1,1,1},
               {9,0,1,1,1,1},
               {9,0,0,9,1,1},
               {9,0,0,0,0,1},
               {
9,0,0,0,0,0}}; int dx[8]={1,1,-1,-1,2,-2,2,-2}; int dy[8]={2,-2,2,-2,1,-1,-1,1}; int T,X,Y,ans,map[6][6]; char c; int H(){ int bns=0; for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) if(map[i][j]!=fxy[i][j]) bns++; if(map[3][3]!=9) bns-=1; return bns; }
void dfs(int k,int X,int Y,int g){ int h=H(); if(!h){ ans=g; return ; } if(h+g>k||ans>=0||g==k) return ; for(int i=0;i<8;i++){ int x=dx[i]+X; int y=dy[i]+Y; if(x>=1&&y>=1&&x<=5&&y<=5){ swap(map[X][Y],map[x][y]); dfs(k,x,y,g+1); swap(map[X][Y],map[x][y]); } } } int main(){ scanf("%d",&T); while(T--){ ans=-1; for(int i=1;i<=5;i++){ for(int j=1;j<=5;j++){ cin>>c; if(c==1) map[i][j]=1; else if(c==0) map[i][j]=0; else{ X=i,Y=j; map[i][j]=9; } } } for(int k=0;k<=15;k++){ dfs(k,X,Y,0); if(ans>=0){ printf("%d\n",ans); break; } } if(ans==-1) cout<<"-1"<<endl; } return 0; }

洛谷 P2324 [SCOI2005]騎士精神